#include<stdio.h>
#define dim 5002
#define INF 32000
struct tata{
int lin,col;
}tata[dim][dim];
int a[dim][dim],ter[dim][dim];
int n,m;
int modificare,pas,ind=0;
int in,jn,nr=0;
const int di[]={-1,-1,0,1,1,1,0,-1};
const int dj[]={ 0,1,1,1,0,-1,-1,-1};
//const char D[]={"NESV"};
int ip,jp,is,js;
void citire();
void lee();
int bun();
void drum(int ,int );
void afisare();
int main()
{
freopen("car.in","r",stdin);
freopen("car.out","w",stdout);
citire();
lee();
afisare();
return 0;
}
void citire()
{
scanf("%d %d",&n,&m);
scanf("%d %d %d %d",&ip,&jp,&is,&js);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&ter[i][j]);
a[i][j]=INF;
}
}
}
void lee()
{
int i,j;
a[ip][jp]=0;
do
{
modificare=0;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(a[i][j]==pas)
for(int dir=0;dir<8;dir++)
{
in=i+di[dir];
jn=j+dj[dir];
if(bun())
{
a[in][jn]=pas+1;
tata[in][jn].lin=i;
tata[in][jn].col=j;
modificare=1;
//if(in==js && jn==js) return ;
}
}
pas++;
}while(modificare);
}
int bun()
{
if(ter[in][jn]==1) return 0;
if(a[in][jn]!=INF) return 0;
if(in<1 || in>n || jn<1 || jn>m) return 0 ;
return 1;
}
void drum(int i,int j)
{
int aux,aux1;
if(i==0 || j==0) return ;
drum(tata[i][j].lin,tata[i][j].col);
if(i==ip && j==jp)
return ;
else
printf("%d %d\n",i,j);
}
void afisare()
{
int i,j;
//(ind==0) printf("-1");
//se
if(a[is][js]==32000)
printf("-1");
else
printf("%d\n",a[is][js]+1);
//drum(is,js);
}