#include<iostream>
#include<vector>
#include<deque>
using namespace std;

int main() {
  int H,W,Ch,Cw,Dh,Dw,i;
  cin>>H>>W>>Ch>>Cw>>Dh>>Dw;
  vector<string> S(H);
  for (i=0;i<H;i++) cin>>S[i];
  deque<pair<int,int>> Q;
  // 最低ワープ回数
  vector<vector<int> > A(H, vector<int>(W, 1e9));
  // 未到達か
  vector<vector<bool> > B(H, vector<bool>(W, true));

  A[Ch-1][Cw-1] = 0;
  Q.push_front(make_pair(Ch-1, Cw-1));
  while(!Q.empty()) {
    // 到達済み座標
    int y = Q.front().first;
    int x = Q.front().second;
    Q.pop_front();
    B[y][x] = false;

    // 徒歩で移動
    vector<pair<int,int> > P = {
      make_pair(y-1, x),
      make_pair(y+1, x),
      make_pair(y, x-1),
      make_pair(y, x+1)
    };
    for (pair<int,int> p: P) {
      int Y = p.first;
      int X = p.second;
      if (0<=Y && Y<H && 0<=X && X<W && B[Y][X] && S[Y][X] != '#') {
        A[Y][X] = min(A[Y][X], A[y][x]);
        Q.push_front(make_pair(Y,X));
      }
    }

    // ワープで移動
    for (int Y=y-2;Y<=y+2;Y++) {
      for (int X=x-2;X<=x+2;X++) {
        if (0<=Y && Y<H && 0<=X && X<W && B[Y][X] && S[Y][X] != '#') {
          A[Y][X] = min(A[Y][X], A[y][x]+1);
          Q.push_back(make_pair(Y,X));
        }
      }
    }
  }

  cout<<(B[Dh-1][Dw-1] ? -1 : A[Dh-1][Dw-1])<<endl;
  return 0;
}
