#include<bits/stdc++.h>
using namespace std;
int head,tail,n,m,state[1000100][3],s,x,y,sx,sy,qx,qy;
bool f[1010][1010];//标记点是否走过 
int a[1010][1010];
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//拓展方向
void bfs()
{
	head=0;
	tail=1;
	state[1][0] = sx;
	state[1][1] = sy; 
	do
	{
		head++;//出队
		for (int i=0;i<4;i++)//4个方向
		{
			x=state[head][0];y=state[head][1];
			int j=1;
			while (a[x+dx[i]*j][y+dy[i]*j] == 0 && x+dx[i]*j<=n && y+dy[i]*j<=m && x+dx[i]*j>0 && y+dy[i]*j>0)
			//如果碰到墙或边缘就结束拓展
			{
			  if (f[x+dx[i]*j][y+dy[i]*j] == false)
			  //如果已经走过的路线就不入队
			  {
			  	tail++;//入队
			  	state[tail][0]=x+dx[i]*j;
			  	state[tail][1]=y+dy[i]*j;//储存位置
			  	state[tail][2]=state[head][2]+1;//储存转弯数
			  	f[x+dx[i]*j][y+dy[i]*j]=true;//已经走过该地
			  	if (x+dx[i]*j==qx && y+dy[i]*j==qy)//结束判断
			  	{
			  		s=state[tail][2];
			  		return;
			  	}
			  }
			  j++;//下一个拓展
			}
		}
	}
	while(head<tail);//空队退出
}
int main()
{
	cin>>n>>m;
	for (int i=1;i<=n;i++)
	{
	  for (int j=1;j<=m;j++)
	  {
	  	cin>>a[i][j];
	  }
	}
	cin>>sx>>sy>>qx>>qy;
//	scanf("%d%d%d%d",&state[1][0],&state[1][1],&qx,&qy);
	//输入不解释
	bfs();//函数不解释
	cout<<s-1<<endl;
}
/**************************************************************
	Problem: 1444
	User: admin
	Language: C++
	Result: Accepted
	Time:17 ms
	Memory:18776 kb
****************************************************************/