#include <iostream>
#include <vector>
#include <string>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
#define rep(i,n) for(int i=0;i<n;i++)
typedef pair<int,int> P;
#define INF 1e9

int di[4]={0,0,1,-1};
int dj[4]={1,-1,0,0};


int main()
{
int h,w;
int ch,cw;
int dh,dw;

cin>>h>>w;
cin>>ch>>cw;
ch--;cw--;
cin>>dh>>dw;
dh--;dw--;
vector<string>s(h);
rep(i,h)cin>>s[i];
deque<P>q;

vector<vector<int>> dist(h,vector<int>(w,INF));
dist[ch][cw]=0;

q.emplace_back(ch,cw);

while(!q.empty())
{
int i=q.front().first;
int j=q.front().second;
int d=dist[i][j];
q.pop_front();


for(int v=0;v<4;v++)
{
int ni=i+di[v];
int nj=j+dj[v];
if(ni<0||ni>=h||nj<0||nj>=w)continue;
if(s[ni][nj]=='#')continue;
if(dist[ni][nj]<=d)continue;
dist[ni][nj]=d;
q.emplace_front(ni,nj);
}

for(int ei=-2;ei<=2;ei++)
{
for(int ej=-2;ej<=2;ej++)
{
int ni=i+ei;
int nj=j+ej;
if(ni<0||ni>=h||nj<0||nj>=w)continue;
if(s[ni][nj]=='#')continue;
if(dist[ni][nj]<=d+1)continue;
dist[ni][nj]=d+1;
q.emplace_back(ni,nj);
}


}

}

int ans=dist[dh][dw];
if(ans==INF)cout <<-1;
else cout <<ans;
}