#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
#define fi first
#define se second
#define endl '\n'
#define y1 holyshit
#define all(x) x.begin(),x.end()
const int inf=0x3f3f3f3f;

int H,W,Ch,Cw,Dh,Dw,dist[1010][1010];
string grid[1010];
deque<pii> dq;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};

int main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	cin>>H>>W>>Ch>>Cw>>Dh>>Dw;
	for(int i=1;i<=H;i++) cin>>grid[i], grid[i].insert(0,"#");
	memset(dist,inf,sizeof(dist));
	dist[Ch][Cw]=0; dq.push_back({Ch,Cw});
	while(!dq.empty()){
		int x=dq.front().fi,y=dq.front().se; dq.pop_front();
		for(int i=0;i<4;i++){
			int nx=x+dx[i],ny=y+dy[i];
			if(nx<1||nx>H||ny<1||ny>W) continue;
			if(grid[nx][ny]=='#') continue;
			if(dist[nx][ny]<=dist[x][y]) continue;
			dist[nx][ny]=dist[x][y];
			dq.push_front({nx,ny});
		}
		for(int i=max(1,x-2);i<=min(H,x+2);i++) for(int j=max(1,y-2);j<=min(W,y+2);j++){
			if(grid[i][j]=='#') continue;
			if(dist[i][j]<=dist[x][y]+1) continue;
			dist[i][j]=dist[x][y]+1;
			dq.push_back({i,j});
		}
	}
	if(dist[Dh][Dw]>=inf) cout<<-1;
	else cout<<dist[Dh][Dw];
	return 0;
}