#include <bits/stdc++.h>

using namespace std;

const int N=1005;

string gr[N];
int dis[N][N];
int n,m,a,b,x,y;

int main()
{
	scanf("%d %d",&n,&m);
	scanf("%d %d %d %d",&a,&b,&x,&y);
	a--; b--; x--; y--;
	for(int i=0;i<n;i++)
	{
		cin >> gr[i];
	}
	deque<pair<int,int> > q;
	q.push_front({a,b});
	memset(dis,-1,sizeof dis);
	dis[a][b]=0;
	while(q.size())
	{
		int cx=q.front().first,cy=q.front().second;
		q.pop_front();
		for(int dx=-1;dx<=1;dx++)
		{
			for(int dy=-1;dy<=1;dy++)
			{
				int nx=cx+dx,ny=cy+dy;
				if(abs(dx)+abs(dy)!=1) continue;
				if(nx<0||ny<0||nx>=n||ny>=m||gr[nx][ny]=='#') continue;
				if(dis[nx][ny]==-1||dis[cx][cy]<dis[nx][ny])
				{
					dis[nx][ny]=dis[cx][cy];
					q.push_front({nx,ny});
				}
			}
		}
		for(int dx=-2;dx<=2;dx++)
		{
			for(int dy=-2;dy<=2;dy++)
			{
				int nx=cx+dx,ny=cy+dy;
				if(nx<0||ny<0||nx>=n||ny>=m||gr[nx][ny]=='#') continue;
				if(dis[nx][ny]==-1||dis[cx][cy]+1<dis[nx][ny])
				{
					dis[nx][ny]=1+dis[cx][cy];
					q.push_back({nx,ny});
				}
			}
		}
	}
	cout << dis[x][y] << endl;
}