#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
int main(){
  int fx[5]={1,-1,0,0},fy[5]={0,0,1,-1};
  int h,w,cx,cy,dx,dy,i,j;
  int INF=(1<<29);
  cin >> h >> w >> cx >> cy >> dx >> dy;
  cx++,cy++,dx++,dy++;
  int a[1010][1010],b[1010][1010];
  for(i=0;i<=h+3;i++){
    for(j=0;j<=w+3;j++){
      a[i][j]=1,b[i][j]=INF;
    }
  }
  for(i=2;i<=h+1;i++){
    for(j=2;j<=w+1;j++){
      char s;
      cin >> s;
      if(s=='.'){
        a[i][j]=0;
      }
    }
  }
  deque<P> que;
  que.push_front(P(cx,cy));
  b[cx][cy]=0;
  while(!que.empty()){
    P p=que.front();
    que.pop_front();
    for(i=0;i<4;i++){
      if(a[p.first+fx[i]][p.second+fy[i]]==0 && b[p.first+fx[i]][p.second+fy[i]]>b[p.first][p.second]){
        b[p.first+fx[i]][p.second+fy[i]]=b[p.first][p.second];
        que.push_front(P(p.first+fx[i],p.second+fy[i]));
      }
    }
    for(i=p.first-2;i<=p.first+2;i++){
      for(j=p.second-2;j<=p.second+2;j++){
        if(a[i][j]==0 && b[i][j]>b[p.first][p.second]+1){
          b[i][j]=b[p.first][p.second]+1;
          que.push_back(P(i,j));
        }
      }
    }
  }
  if(b[dx][dy]==INF){
    cout << -1 << endl;
    return 0;
  }
  cout << b[dx][dy] << endl;
}