#include<bits/stdc++.h>
class Map_B
{
public:
bool Map[1001][1001];
bool Range(int Ax,int Ay,int Bx,int By);
int Short(int startx,int starty,int endx,int endy,int n,int m);
};
int Map_B::Short(int startx,int starty,int endx,int endy,int n,int m)
{
std::queue<int> x,y,s;
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int sum[1000][1000];
bool use[1000][1000];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
sum[i][j]=0;
use[i][j]=Map[i][j];
}
}
x.push(startx);
y.push(starty);
s.push(0);
use[startx][starty]=1;
while(x.empty()==0&&y.empty()==0)
{
for(int i=0;i<4;i++)
{
int nx=x.front()+dx[i];
int ny=y.front()+dy[i];
int ns=s.front()+1;
if(nx<=n&&nx>=1&&ny<=m&&ny>=1&&use[nx][ny]==0)
{
use[nx][ny]=1;
sum[nx][ny]=ns;
x.push(nx);
y.push(ny);
s.push(ns);
}
}
x.pop();
y.pop();
s.pop();
}
if((startx!=endx||starty!=endy)&&sum[endx][endy]==0)
sum[endx][endy]=-1;
return sum[endx][endy];
}
bool Map_B::Range(int Ax,int Ay,int Bx,int By)
{
int tarx=Ax;
int tary=Ay;
while(Map[tarx][tary]==0)
{
tarx++;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tary++;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tarx--;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tary--;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tarx++;
tary++;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tarx++;
tary--;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tarx--;
tary--;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
tarx=Ax;
tary=Ay;
while(Map[tarx][tary]==0)
{
tarx--;
tary++;
if(tarx==Bx&&tary==By)
{
return 1;
}
}
return 0;
}
using namespace std;
int main()
{
Map_B r;
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>r.Map[i][j];
}
}
int startx,starty,endx,endy;
cin>>startx>>starty>>endx>>endy;
cout<<1;
cout<<r.Short(startx,starty,endx,endy,n,m);
}