#include <fstream>
#include <queue>
#include <bitset>
using namespace std;
int N,M,xi,yi,xf,yf;
bitset<512> a[512];
queue<int> L[3];
const int Inf=2000000000;
const int dx[8][5]={{0,-1,-1,1,1},{-1,-1,-1,0,1},{-1,-1, 0,-1,0},{-1, 0,+1,-1,-1},
{ 0,+1,1,-1,-1},{+1,1,1, 0,-1},{1,1,0,+1, 0},{1,0,-1,1,+1}};
const int dy[8][5]={{1,+1, 0,1,0},{+1, 0,-1,1,1},{ 0,-1,-1,+1,1},{-1,-1,-1, 0,+1},
{-1,-1,0,-1, 0},{-1,0,1,-1,-1},{0,1,1,-1,-1},{1,1,+1,0,-1}};
int d[8][512][512];
int main(){
int i,j,k;
ifstream f("car.in");
ofstream g("car.out");
f>>N>>M;
f>>xi>>yi>>xf>>yf;
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
f>>k,a[i][j]=k;
memset(d,0x3f,sizeof(d));
k=0;
for (i=0;i<8;++i){
j=xi + (yi<<9) + (i<<18);
L[k].push(j);
d[i][xi][yi]=0;
}
int dir,x,y,_x,_y,_dir,now=0,_now;
for (;L[0].size()+L[1].size()+L[2].size()>0;++k,++now){
if (now>2) now-=3;
for (;!L[now].empty();L[now].pop()){
i=L[now].front();
dir=i>>18;
x=i&511;
y=(i>>9)&511;
if (x==xf && y==yf ) {g<<k;
return 0;}
for (i=0;i<5;++i){
_x=x+dx[dir][i];
_y=y+dy[dir][i];
_dir=(dir+i)&7;
if (i>2) _dir=(dir-i+10)&7;
if (_x>0 && _x<=N && _y>0 && _y<=M && !a[_x][_y])
if (d[_dir][_x][_y]>k+i){
d[_dir][_x][_y]=k+i;
_now=(now+i)%3;
if (i>2) _now=(now+i-2)%3;
L[_now].push(_x+ (_y<<9) + (_dir<<18));
}
}
}
}
g<<-1;
return 0;
}