#include<cstdio>
#include<deque>
using namespace std;
int a[505][505];
int d[505][505][8];
const int INF=1000000000;
struct NOD
{
int x,y,dir;
NOD() {x=y=dir=0;}
NOD(int xx,int yy,int ddir) {x=xx;y=yy;dir=ddir;}
inline bool inside(int n,int m)
{
return 1<=x && x<=n && 1<=y && y<=m;
}
};
int dx[]={-1,-1, 0, 1, 1, 1, 0,-1};
int dy[]={ 0, 1, 1, 1, 0,-1,-1,-1};
deque<NOD> q;
int main()
{
freopen("car.in","r",stdin);
freopen("car.out","w",stdout);
int n,m,x1,y1,x2,y2;
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
for(int dir=0;dir<8;dir++)
d[i][j][dir]=INF;
}
if(a[x1][y1]==1)
{
printf("-1\n");
return 0;
}
for(int i=0;i<8;i++)
{
q.push_back(NOD(x1,y1,i));
d[x1][y1][i]=0;
}
while(!q.empty())
{
NOD tmp=q.front();
q.pop_front();
NOD next(tmp.x+dx[tmp.dir],tmp.y+dy[tmp.dir],tmp.dir);
if(next.inside(n,m) && d[next.x][next.y][next.dir]>d[tmp.x][tmp.y][tmp.dir] && a[next.x][next.y]==0)
d[next.x][next.y][next.dir]=d[tmp.x][tmp.y][tmp.dir],
q.push_front(next);
next=NOD(tmp.x,tmp.y,(tmp.dir+1)&7);
if(d[next.x][next.y][next.dir]>d[tmp.x][tmp.y][tmp.dir]+1)
d[next.x][next.y][next.dir]=d[tmp.x][tmp.y][tmp.dir]+1,
q.push_back(next);
next=NOD(tmp.x,tmp.y,(tmp.dir+7)&7);
if(d[next.x][next.y][next.dir]>d[tmp.x][tmp.y][tmp.dir]+1)
d[next.x][next.y][next.dir]=d[tmp.x][tmp.y][tmp.dir]+1,
q.push_back(next);
}
int ans=d[x2][y2][0];
for(int i=1;i<8;i++)
ans=min(ans,d[x2][y2][i]);
printf("%d\n",ans==INF?-1:ans);
return 0;
}