#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
#pragma GCC target ("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
#define IOS ios_base::sync_with_stdio(false);cin.tie(NULL);
#define ff first
#define ss second
#define eb emplace_back
#define MP make_pair
#define pb push_back
#define pf push_front
#define ins insert
#define endl '\n'
#define all(v) (v).begin(), (v).end()
#define mset(m,v) memset(m,v,sizeof(m))
#define tr(c,it) for(auto it=c.begin();it!=c.end();it++)
#define fr(i,n) for(lli i=0;i<(n);i++)
#define inc(i,a,b) for(lli i=a;i<=b;i++)
#define dec(i,a,b) for(lli i=a;i>=b;i--)
#define fr2(i,n) for(int i=0;i<(n);i++)
#define inc2(i,a,b) for(int i=a;i<=b;i++)
#define dec2(i,a,b) for(int i=a;i>=b;i--)
#define ymin(a,b)  (a=min((a),(b)))
#define ymax(a,b)  (a=max((a),(b)))
#define sz(x) (lli)(x).size()
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
	cerr<< *it << " = " << a << endl;
	err(++it, args...);
}

typedef long long int lli;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<lli,lli> plli;
typedef vector<lli> vlli;
typedef vector<int> vi;
//typedef  vector<vector<lli> >ncr(1001,vector<lli>(1001,0))
typedef vector<plli> vplli;
long long MOD=1000000009;
#define addm(x,y) (x+y>=MOD? (x+y-MOD):(x+y))
lli h,w;
lli cw,ch,dw,dh;
char mat[1005][1005];
//lli  dp[1005][1005];
bool check(lli x,lli y)
{
	//cout<<"yp"<<x<<" "<<y<<endl;
	if(x>=0 && x<h && y>=0 && y<w )
	{
		if(mat[x][y]=='#')
			return false;
		return true;
	}
	return false;

}
// lli dx[4]={-1,0,1,0};
// lli dy[4]={0,1,0,-1};
// lli go(lli x,lli y)
// {
// 	//cout<<x<<" "<<y<<endl;
// 	if(x==dh && y==dw)
// 		return 0;
// 	if(!check(x,y))
// 		return 1e15;
// 	if(dp[x][y]!=-1)
// 		return dp[x][y];
// 	lli &ans=dp[x][y];
// 	ans=1e15;
// 	fr(i,4)
// 	{
// 		lli xx=x+dx[i];
// 		lli yy=y+dy[i];
// 		//cout<<xx<<" "<<yy<<endl;
// 		if(check(xx,yy))
// 			ans=min(ans,go(xx,yy));
// 	}
// 	for(lli i=max(x-2,0ll);i<=min(x+2,h-1);i++)
// 	{
// 		for(lli j=max(y-2,0ll);j<=min(y+2,w-1);j++)

// 		{

// 			if(check(i,j))
// 			ans=min(ans,go(i,j)+1);
// 		}	
// 	}
// 	//cout<<ans<<" "<<x<<" "<<y<<endl;
// 	return dp[x][y]=ans;



// }
lli dis[1001][1001],vis[1001][1002];
void bfs01()
{
	deque<plli>dq;
	for(lli i=0;i<h;i++)
	{
		for(lli j=0;j<w;j++)
		{
			vis[i][j]=false;
			dis[i][j]=1e15;
		}

	}
	dq.pb({ch,cw});
	dis[ch][cw]=0;
	while(!dq.empty())
	{
		plli xx=dq.front();
		dq.pop_front();
		// for(auto v:g[xx])
		// {
		// 	int neigh=v.ff;
		// 	int w=v.ss;
		// 	if(dis[neigh]>dis[xx]+w)
		// 	{
		// 		dis[neigh]=dis[xx]+w;
		// 		if(w==0)
		// 			dq.push_front(neigh);
		// 		else
		// 			dq.push_back(neigh);
		// 	}

		// }
		if(vis[xx.ff][xx.ss])
			continue;
		vis[xx.ff][xx.ss]=true;
		//cout<<xx.ff<<" "<<xx.ss<<endl;
		for(lli i=max(xx.ff-2,0ll);i<=min(xx.ff+2,h-1);i++)
	{
		for(lli j=max(xx.ss-2,0ll);j<=min(xx.ss+2,w-1);j++)

		{
			if(i==xx.ff && j==xx.ss)
				continue;
			//cout<<i<<" "<<j<<" "<<xx.ff<<" "<<xx.ss<<" p"<<endl;
			if(!check(i,j))
				continue;
			//cout<<i<<" "<<j<<" "<<xx.ff<<" "<<xx.ss<<" ok"<<endl;
			lli wei;
			if(abs(i-xx.ff)+abs(j-xx.ss)==1)
				wei=0;
			else
				wei=1;



			if(check(i,j)&&  dis[i][j]>dis[xx.ff][xx.ss]+wei)

			{
				dis[i][j]=dis[xx.ff][xx.ss]+wei;
								if(wei==0)
					dq.push_front({i,j});
				else
					dq.push_back({i,j});
				
				

			}
			//ans=min(ans,go(i,j)+1);
		}	
	}
	}

}
int main()
{
		#ifndef ONLINE_JUDGE
	freopen("input.txt","r",stdin);
	freopen("output.txt","w",stdout);
	#endif
	IOS
	
	// int t;
	// cin>>t;
	// for(int i=1;i<=t;i++)
	// {
	// 	cout<<"Case #"<<i<<": ";
	// 	solve();

	// }
	
	cin>>h>>w;
	
	cin>>ch>>cw>>dh>>dw;
	///h--;
	//w--;
	cw--;
	ch--;
	dw--;
	dh--;
	//cout<<h<<" "<<w<<endl;

	
	// fr(i,h)
	// {
	// 	fr(j,w)
	// 	{
	// 	cin>>mat[i][j];
	// 	cout<<mat[i][j]<<i<<" "<<j;
	// }
	// cout<<endl;
	// }
	for(lli i=0;i<h;i++)
	{
		for(lli  j=0;j<w;j++)
		{
			cin>>mat[i][j];
			//cout<<mat[i][j];
		}
		///cout<<endl;

	}
	
// 	mset(dp,-1);
// //	cout<<check(0,0)<<endl;
// 	lli p=go(cw,ch);
// 	if(p>=1e15)
// 		cout<<-1<<endl;
// 	else

// 	cout<<p<<endl;
	bfs01();
	if(dis[dh][dw]>=1e15)
		cout<<-1<<endl;
	else
		cout<<dis[dh][dw]<<endl;

	
	
}


Measured memory_bytes: 20440