#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
#include<algorithm>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<math.h>
#include<tuple>
#include<string.h>
#include <numeric> 
#include<unordered_map>
#include<deque>
using namespace std; 
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename \
  enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define pp(...) "\033[94m [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "]\033[0m"
#define pp1(...) "\033[1;47;35m" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "]\033[0m"
#define dg(x) debug() << pp1(x)
#define dg1(x) debug() << "[line : " << __LINE__ <<"]"<< pp(x)
#define dg2(x,y) debug() << "[line : " << __LINE__ <<"]"<< pp(x) pp(y)
#define dg3(x,y,z) debug() << "[line : " << __LINE__ <<"]"<< pp(x) pp(y) pp(z)
#define dg4(w,x,y,z) debug() << "[line : " << __LINE__ <<"]"<< pp(w) pp(x) pp(y) pp(z)
#define int long long
#define all(x) x.begin() , x.end()
#define clr(x, y) memset(x , y , sizeof x);
#define sz(x) (int)x.size()
template<typename T> void db(T x ){ debug() <<">>> " <<  x; }
template<typename T> void db(T x , T y){ debug() <<">>> " <<  x <<" , "<< y; }
template<typename T> void db(T x , T y , T z){ debug() <<">>> "<< x <<" , "<< y <<" , "<< z; }
template<typename T> void db(T x , T y , T z , T a){ debug() <<">>> "<< x <<" , " << y <<" , "<< z <<" , "<< a; }
// const int xx = 2e5;
const int Mod = 1e9 + 7;
const int inf = 1e18;
const int Maxn = 20010;
vector<int>fx = {+0,+0,+1,-1,-1,+1,-1,+1};
vector<int>fy = {-1,+1,+0,+0,+1,+1,-1,-1};
const int dirx[]={+1,-1,+0,+0};
const int diry[]={+0,+0,+1,-1};
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);

  int N , M;
  cin >> N >> M;
  int sx, sy, dx, dy;
   cin >> sx >> sy >> dx >> dy;
   sx--,sy--,dx--,dy--;
   string g[N];
   for(int i = 0; i < N; i++) {
     cin >> g[i];
   }
   vector<vector<int>>dp(N, vector<int>(M,inf));
   deque<pair<int,int>>q;

   q.emplace_back(sx,sy);
   dp[sx][sy] = 0;

   auto valid = [&](int x, int y) {
     if(x >= 0 && x < N && y >= 0 && y < M && g[x][y] == '.') {
       return 1ll;
     }
     return 0ll;
   };
   while(!q.empty()) {
     auto px = q.front().first;
     auto py = q.front().second;
     q.pop_front();
     for(int i = 0; i < 4; i++) {
       int xx = px + dirx[i] , yy = py + diry[i];
       if(valid(xx, yy) && dp[xx][yy] >  dp[px][py]) {
         dp[xx][yy] = dp[px][py];
         q.emplace_front(xx, yy);
       }
     }
     for(int i = -2; i <= 2; i++){
       for(int j = -2; j <= 2; j++) {
         int x = px + i;
         int y = py + j;
         if(valid(x,y) && dp[x][y] > dp[px][py] + 1) {
           dp[x][y] = dp[px][py] + 1;
           q.emplace_back(x, y);
         }
       }
     }
   }
     int ans = dp[dx][dy];
     if(ans == inf) ans = -1;
     cout << ans << '\n';
}


Measured memory_bytes: 12616