#include <bits/stdc++.h>
using namespace std;

#define hutougou 1<=h-2+a && h-2+a<=H && 1<=w-2+b && w-2+b<=W
 
int main() {
  int H,W;
  cin>>H>>W;
  int judge=0;
  
  pair<int,int>start;
  cin>>start.first>>start.second;
  //start.first--;
  //start.second--;
  
  int cost=0;
  
  pair<int,int>goal;
  cin>>goal.first>>goal.second;
  //goal.first--;
  //goal.second--;
  
  vector<vector<char>>tizu(1100,vector<char>(1100));//start.at(h).at(w)
  
  for(int a=1;a<=H;a++){
    for(int b=1;b<=W;b++){
      cin>>tizu.at(a).at(b);
      //cout<<tizu.at(a).at(b);
    }
    //cout<<endl;
  }
  
  /////////////////////////////////ここまでデータ入力
  
  //startから四方向に探索、道があったら未探索キュー、到達セットに入れる、
  //（その道が到達セットにあったら入れない）未探索キューからマスを削除
  //端っこの場合無いとこを探索しちゃうので制限をしようね
  //キューに入れたマスで四方向に探索。
  //goalに着いたら終了。探索し終えてgoalにつかなかったらキューの座標を中心に
  //5x5マスの道の探索を行う。（もちろんこの時goalに着いたら終了）
  //その道を未探索キューに入れて四方向に探索。繰り返し。
  
  queue<pair<int,int>> mitansaku;
  mitansaku.push(start);
  
  set<pair<int,int>> toutatu;
  queue<pair<int,int>> toutatuqueue;
  toutatu.insert(start);
  toutatuqueue.push(start);
  
  queue<pair<int,int>>toutatuyobi;
  
  
  while(toutatu.count(goal)==0){
    while(mitansaku.empty()==0){
      int h=mitansaku.front().first;
      int w=mitansaku.front().second;
      //cout<<mitansaku.front().first<<"  "<<mitansaku.front().second<<endl;
      
      //四方向に道があるか探索
      if(h+1<=H && tizu.at(h+1).at(w)=='.'){
        pair<int,int> sita(h+1,w);
        if(toutatu.count(sita)==0){
          mitansaku.push(sita);
          toutatuqueue.push(sita);
          toutatu.insert(sita);
          //cout<<"sita"<<endl;
        }
      }
      if(w+1<=W && tizu.at(h).at(w+1)=='.'){
        pair<int,int> migi(h,w+1);
        if(toutatu.count(migi)==0){
          mitansaku.push(migi);
          toutatuqueue.push(migi);
          toutatu.insert(migi);
          //cout<<"migi"<<endl;
        }
      }
      if(1<=h-1 && tizu.at(h-1).at(w)=='.'){
        pair<int,int> ue(h-1,w);
        if(toutatu.count(ue)==0){
          mitansaku.push(ue);
          toutatuqueue.push(ue);
          toutatu.insert(ue);
          //cout<<"ue"<<endl;
        }
      }
      if(1<=w-1 && tizu.at(h).at(w-1)=='.'){
        pair<int,int> hidari(h,w-1);
        if(toutatu.count(hidari)==0){
          mitansaku.push(hidari);
          toutatuqueue.push(hidari);
          toutatu.insert(hidari);
          //cout<<"hidari"<<endl;
        }
      }
      mitansaku.pop();
    }
    //costN探索終了　これより下はcostN+1に入る
    if(toutatu.count(goal)) break;
    cost++;
    
    while(toutatuqueue.empty()==0){
      int h=toutatuqueue.front().first;
      int w=toutatuqueue.front().second;
      for(int a=0;a<5;a++){
        for(int b=0;b<5;b++){
          pair<int,int>miti(h-2+a,w-2+b);
          if(hutougou && tizu.at(h-2+a).at(w-2+b)=='.' && toutatu.count(miti)==0){
            toutatu.insert(miti);
            toutatuyobi.push(miti);
            mitansaku.push(miti);
            //cout<<"hai"<<endl;
          }
        }
      }
      toutatuqueue.pop();
    }
    while(toutatuyobi.empty()==0){
      toutatuqueue.push(toutatuyobi.front());
      toutatuyobi.pop();
    }
    if(toutatu.count(goal)) break;
    if(mitansaku.empty()==1){
      judge=1;
      break;
    }
  }
  if(judge)cout<<"-1";
  else cout<<cost;
}
            
          
    
    
  
  


Measured memory_bytes: 24496