#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef std::pair<int,int> pair2;
typedef std::pair<int,pair2> pair3;
const ll INF = 1LL<<60;

int main(){
  ll H,W;
  cin>>H>>W;
  ll Ch,Dh,Cw,Dw;
  cin>>Ch>>Cw>>Dh>>Dw;
char S[H][W];
ll dist[H][W];
  for(ll i=0;i<H;i++){
    for(ll j=0;j<W;j++){
     cin>>S[i][j];
     dist[i][j]=INF;
    }
  }
  
  dist[Ch-1][Cw-1]=0;
  deque<pair<ll,ll> > que;
  que.push_front(make_pair(Ch-1,Cw-1));
  
  
  while(!que.empty()){
  ll h=que.front().first;
  ll w=que.front().second;
  que.pop_front();

    
    for(ll i=-2;i<=2;i++){
      //cout<<i<<endl;
      for(ll j=-2;j<=2;j++){
        if(abs(i)+abs(j)==0){continue;}
        if(h+i<0||H<=h+i){continue;}
        if(w+j<0||W<=w+j){continue;}
        if(S[h+i][w+j]=='#'){continue;}        
        if((abs(i)+abs(j))==1){
          if(dist[h+i][w+j]<=dist[h][w]){continue;}
          dist[h+i][w+j]=dist[h][w];
          que.push_front(make_pair(h+i,w+j));
        }
        
        if(dist[h+i][w+j]<=dist[h][w]+1){continue;}
         dist[h+i][w+j]=dist[h][w]+1;
         que.push_back(make_pair(h+i,w+j));
                
      }
    }
    
  }
  
  
  
  
  
if(dist[Dh-1][Dw-1]==INF){
cout<<"-1"<<endl;
} 
else{
  cout<<dist[Dh-1][Dw-1]<<endl;}
  
}
