#define _GLIBCXX_DEBUG
#include<bits/stdc++.h>
#include<algorithm>//next_permutation
#define rep(i,n) for (int i = 0;i < (n);i++)
#define all(v) v.begin(),v.end()
#define dec(n) cout << fixed << setprecision(n);
#define large "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
#define small "abcdefghijklmnopqrstuvwxyz"
using namespace std;
using ll = long long;
using P = pair<ll,ll>;
using vl = vector<ll>;
using vvl = vector<vl>;

ll gcd(ll a,ll b){
  if(b == 0) return a;
  return gcd(b , a % b);
}

const ll MOD = 1000000007;
const ll MAX = 2000001;

ll mod(ll a){
  return a % MOD;
}

ll lcm(ll a,ll b){
  return (a*b)/gcd(a,b);
}

ll fac[MAX], finv[MAX], inv[MAX];

void nCrprep() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (ll i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

ll nCr(ll n, ll r){
    if (n < r) return 0;
    if (n < 0 || r < 0) return 0;
    return fac[n] * (finv[r] * finv[n - r] % MOD) % MOD;
}

ll nCrcheep(ll n,ll r){
  if(r == 0) return 1;
  else if(r == 1) return n;
  else return nCrcheep(n-1,r-1)*n/r;
}

vector<pair<ll,ll>> prime_factorize(ll n){
  vector<pair<ll,ll>> res;
  
  for(ll i=2; i*i <= n; i++){
    if(n % i != 0) continue;
    
    ll ex = 0;
    while(n % i == 0){
      ex++;
      n /= i;
    }
    
    res.push_back({i,ex});
  }
  
  if(n != 1) res.push_back({n,1});
  
  return res;
  
}




int main(){
  ll h,w,sx,sy,gx,gy; cin >> h >> w >> sx >> sy >> gx >> gy;
  sx--; sy--; gx--; gy--;
  vector<vector<char>> table(h,vector<char>(w));
  vvl numtable(h,vl(w,1e9));
  
  rep(i,h){
    rep(j,w){
      cin >> table[i][j];
    }
  }
  
  queue<pair<ll,ll>> walkin;
  queue<pair<ll,ll>> magicin;
  
  walkin.push(make_pair(sx,sy));
  numtable[sx][sy] = 0;

  while(!walkin.empty() or !magicin.empty()){
    
    while(!walkin.empty()){
      
      vector dx = {-1,1,0,0};
      vector dy = {0,0,-1,1};
      
      auto p = walkin.front();
      magicin.push(p);
      walkin.pop();
      
      ll nowx = p.first; ll nowy = p.second;
      
      for(ll i=0; i < 4; i++){
        
        ll gox = nowx+dx[i]; ll goy = nowy+dy[i];
        
        if(0 <= gox and gox < h and 0 <= goy and goy < w and
           numtable[gox][goy] == 1e9 and table[gox][goy] != '#'){
          
          walkin.push(make_pair(gox,goy));
          numtable[gox][goy] = numtable[nowx][nowy];
        }
      }
    }
    
    while(!magicin.empty()){
      
      vector dx = {-2,-1,0,1,2};
      vector dy = {-2,-1,0,1,2};
      
      auto p = magicin.front();
      magicin.pop();
      
      ll nowx = p.first; ll nowy = p.second;
      
      for(ll i=0; i < 5; i++){
        for(ll j=0; j < 5; j++){
          
          ll gox = nowx+dx[i]; ll goy = nowy+dy[j];
          
          if(0 <= gox and gox < h and 0 <= goy and goy < w and
             numtable[gox][goy] == 1e9 and
             table[gox][goy] != '#'){
            
            walkin.push(make_pair(gox,goy));
            numtable[gox][goy] = numtable[nowx][nowy] + 1;
          }
        }
      }
    }
    
  }


  
  if(numtable[gx][gy] == 1e9){
    cout << -1 << endl;
  }
  else cout << numtable[gx][gy] << endl;
  
}

Measured memory_bytes: 12732