#include <bits/stdc++.h>
#define rep3(i, s, n, a) for (int i = (s); i < (int)(n); i += a)
#define rep2(i, s, n) rep3(i, s, n, 1)
#define rep(i, n) rep2(i, 0, n)

using namespace std;
using ll = long long;
using ull = unsigned long long;
using P = pair<int, int>;

typedef struct {
    int h;
    int w;
    int warp;
} point;

bool operator>(const point &student1, const point &student2) {
  return student1.warp > student2.warp;
};

vector<vector<int>> minim;
int h, w;
int dh, dw;
bool finish=false;
set<P> p;

// bool dfs(int sh, int sw, int warp);

int main(){
    cin >> h >> w;
    int ch, cw;
    cin >> ch >> cw;
    ch--;
    cw--;
    cin >> dh >> dw;
    dh--;
    dw--;
    // vector<string> s;
    rep(i, h){
        string x;
        cin >> x;
        vector<int> tmpa(w, INT32_MAX);
        rep(j, w){
            if(x[j]=='#'){
                tmpa[j] = -1;
            }
        }
        // board.push_back(tmp);
        minim.push_back(tmpa);
        // s.push_back(x);
    }

    point p;
    p.h = ch;
    p.w = cw;
    p.warp = 0;
    minim[p.h][p.w] = p.warp;

    priority_queue< point, vector<point>, greater<point> > pq;
    pq.push(p);

    while(!pq.empty()){
        point now = pq.top();
        pq.pop();
        if (now.w != w - 1 && minim[now.h][now.w + 1] != -1 &&
            now.warp < minim[now.h][now.w + 1]) {
          p.h = now.h;
          p.w = now.w + 1;
          p.warp = now.warp;
          minim[p.h][p.w] = p.warp;
          pq.push(p);
        }
        if (now.h != 0 && minim[now.h - 1][now.w] != -1 &&
            now.warp < minim[now.h - 1][now.w]) {
          p.h = now.h - 1;
          p.w = now.w;
          p.warp = now.warp;
          minim[p.h][p.w] = p.warp;
          pq.push(p);
        }
        if (now.w != 0 && minim[now.h][now.w - 1] != -1 &&
            now.warp < minim[now.h][now.w - 1]) {
          p.h = now.h;
          p.w = now.w - 1;
          p.warp = now.warp;
          minim[p.h][p.w] = p.warp;
          pq.push(p);
        }
        if (now.h != h - 1 && minim[now.h + 1][now.w] != -1 &&
            now.warp < minim[now.h + 1][now.w]) {
          p.h = now.h + 1;
          p.w = now.w;
          p.warp = now.warp;
          minim[p.h][p.w] = p.warp;
          pq.push(p);
        }

        rep2(i, max(0, now.h-2), min(h, now.h+3)){
            rep2(j, max(0, now.w-2), min(w, now.w+3)){
                if(minim[i][j]!=-1&&now.warp+1<minim[i][j]){
                    p.h = i;
                    p.w = j;
                    p.warp = now.warp + 1;
                    minim[p.h][p.w] = p.warp;
                    pq.push(p);
                }
            }
        }
    }

    // bool flag = true;
    // int cnt=0;
    // set<P> tmp;
    // tmp.insert(make_pair(ch, cw));
    // while(flag){
    //     for(auto it = tmp.begin();it!=tmp.end();it++){
    //       flag = dfs((*it).first, (*it).second, cnt);
    //     }
    //     tmp.clear();
    //     for(auto it = p.begin();it!=p.end();it++){
    //         tmp.insert(*it);
    //     }
    //     cnt++;
    // }
    // int ans = dfs(ch, cw, 0);
    if(minim[dh][dw]==INT32_MAX){
        minim[dh][dw] = -1;
    }
    cout << minim[dh][dw] << endl;
    // rep(i, h){
    //     rep(j ,w){
    //         cout << board[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    return 0;
}

// bool dfs(int sh, int sw, int warp) {
// //   cout << sh << " " << sw << endl;
//   minim[sh][sw] = warp;
//   bool ans;
//   bool flag = false;
//   if (sh == dh && sw == dw) {
//     finish = true;
//     return flag; // false
//   }
// //   int ans = INT32_MAX;
//   if (sw != w - 1 && minim[sh][sw+1]==INT32_MAX) {
//     flag = true;
//     ans = dfs(sh, sw + 1, warp);
//   }
//   if (sh != 0 && minim[sh - 1][sw] == INT32_MAX) {
//     flag = true;
//     ans = dfs(sh - 1, sw, warp);
//   }
//   if (sw != 0 && minim[sh][sw - 1] == INT32_MAX) {
//     flag = true;
//     ans = dfs(sh, sw - 1, warp);
//   }
//   if (sh != h - 1 && minim[sh + 1][sw] == INT32_MAX) {
//     flag = true;
//     ans = dfs(sh + 1, sw, warp);
//   }

//   rep2(i, max(0, sh - 2), min(h, sh + 3)) {
//     rep2(j, max(0, sw - 2), min(w, sw + 3)) {
//       if (minim[i][j] == INT32_MAX) {
//         flag = true;
//         p.insert(make_pair(i, j));
//       }
//     }
//   }

//   if(finish){
//       return false;
//   }

//   return flag;

// //   if (flag) {
// //     return INT32_MAX;
// //   } else {
// //     return ans;
// //   }
// }

// int dfs(int sh, int sw, int warp){
//     // cout << sh << " " << sw << endl;
//     board[sh][sw] = 1;
//     minim[sh][sw] = min(warp, minim[sh][sw]);
//     bool flag = true;
//     if(sh==dh&&sw==dw){
//         return warp;
//     }
//     int ans = INT32_MAX;
//     if(sw!=w-1&&board[sh][sw+1]==0){
//         flag = false;
//         ans = min(ans, dfs(sh, sw+1, warp));
//     }
//     if (sh != 0 && board[sh-1][sw]==0) {
//       flag = false;
//       ans = min(ans, dfs(sh - 1, sw, warp));
//     }
//     if (sw != 0 && board[sh][sw - 1]==0) {
//       flag = false;
//       ans = min(ans, dfs(sh, sw - 1, warp));
//     }
//     if (sh != h - 1 && board[sh + 1][sw]==0) {
//       flag = false;
//       ans = min(ans, dfs(sh + 1, sw, warp));
//     }

//     rep2(i, max(0, sh-2), min(h, sh+3)){
//         rep2(j, max(0, sw-2), min(w, sw+3)){
//             if(board[i][j]==0){
//               flag = false;
//               ans = min(ans, dfs(i, j, warp + 1));
//             }
//         }
//     }

//     if(flag){
//         return INT32_MAX;
//     }else{
//         return ans;
//     }
// }

Measured memory_bytes: 7420