#include<iostream>
#include<queue>
using namespace std;
int m,n,ax,ay,bx,by;
int g[500][500];
int len;
struct node{
int x;
int y;
};
void wire(){ //分支限界,只要找到可行解必是最优解
if(ax==bx && ay==by){
len=0;
}
queue<node> q;
node offset[4];
offset[0].x=0; offset[0].y=1; //right
offset[1].x=1; offset[1].y=0; //down
offset[2].x=0; offset[2].y=-1; //left
offset[3].x=-1; offset[3].y=1; //up
int neighbour_num=4;
node here,neighbour;
here.x=ax; here.y=ay;
g[ax][ay]=2;
do{
for(int i=0;i<neighbour_num;i++){
neighbour.x=here.x+offset[i].x;
neighbour.y=here.y+offset[i].y;
if(g[neighbour.x][neighbour.y]==0){ //该方格未被标记
g[neighbour.x][neighbour.y]=g[here.x][here.y]+1;
if((neighbour.x == bx) && (neighbour.y == by)){
//布线完成
break;
}
q.push(neighbour);
}
}
if((neighbour.x == bx) && (neighbour.y == by)){
//布线完成
break;
}
if(q.empty()){
break;
}
here=q.front();
q.pop();
}while(1);
return ;
}
int main(){
cin>>m>>n;
for(int i=0;i<=n;i++){
g[0][i]=1;
g[m+1][i]=1;
}
for(int i=0;i<=m;i++){
g[i][0]=1;
g[i][n+1]=1;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
}
}
cin>>ax>>ay>>bx>>by;
wire();
if(len!=0){
len=g[bx][by]-2;
}
cout<<len;
return 0;
}