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

#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }

void err(istream_iterator<string> it) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
    cerr << *it << " = " << a << endl;
    err(++it, args...);
}

bool is(ll i, ll j, ll h, ll w, vector<vector<char> > &A, vector<vector<ll> > &vis) {
    if(i>=0 && j>=0 && i<h && j<w && A[i][j]=='.' && vis[i][j]==-1)
        return true;
    return false;
}
bool is1(ll i, ll j, ll h, ll w, vector<vector<char> > &A, vector<vector<ll> > &vis) {
    if(i>=0 && j>=0 && i<h && j<w && A[i][j]=='.' && vis[i][j]!=-1)
        return true;
    return false;
}

void dfs(ll x, ll y, vector<vector<char> > &A, vector<vector<ll> > &vis, ll color, ll h, ll w) {

    vis[x][y] = color;
    if(is(x-1,y,h,w,A,vis))
        dfs(x-1,y,A,vis,color,h,w);
    if(is(x,y-1,h,w,A,vis))
        dfs(x,y-1,A,vis,color,h,w);
    if(is(x+1,y,h,w,A,vis))
        dfs(x+1,y,A,vis,color,h,w);
    if(is(x,y+1,h,w,A,vis))
        dfs(x,y+1,A,vis,color,h,w);
}

void code() {
    ll h,w;
    cin>>h>>w;
    ll ch, cw, dh, dw;
    cin>>ch>>cw>>dh>>dw;
    ch--;
    cw--;
    dh--;
    dw--;
    ll ans=0;
    vector<vector<char> > A(h, vector<char>(w));
    for(ll i=0; i<h; i++) {
        for(ll j=0; j<w; j++) {
            cin>>A[i][j];
        }
    }
    vector<vector<ll> > vis(h, vector<ll>(w, -1));
    ll color=0;
    for(ll i=0; i<h; i++) {
        for(ll j=0; j<w; j++) {
            if(is(i,j,h,w,A,vis)) {
                dfs(i, j, A, vis, color, h, w);
                color++;
            }
        }
    }
//    error(color);
    vector<ll> adj[color];

    for(ll i=0; i<h; i++) {
        for(ll j=0; j<w; j++) {
            if(vis[i][j]==-1)
                continue;
            for(ll x=-2; x<=2; x++) {
                for(ll y=-2; y<=2; y++) {
                    if(is1(i+x, j+y, h, w, A, vis)) {
                       adj[vis[i][j]].push_back(vis[i+x][j+y]);
                        adj[vis[i+x][j+y]].push_back(vis[i][j]);
                    }
                }
            }
        }
    }


//    for(ll c=0; c<color; c++) {
//        for(ll i=0; i<h; i++) {
//            for(ll j=0; j<w; j++) {
//                if(vis[i][j]==c) {
//                    for(ll x=-2; x<=2; x++) {
//                        for(ll y=-2; y<=2; y++) {
//                            if(is1(i+x, j+y, h, w, A,vis) &&  vis[i+x][j+y]!=c) {
//                                adj[c].push_back(vis[i+x][j+y]);
//                            }
//                        }
//                    }
//                }
//            }
//        }
//    }
//    for(ll i=0; i<color; i++) {
//        for(ll j=0; j<adj[i].size(); j++)
//            cout << adj[i][j];
//        cout << '\n';
//    }
    queue<ll> q;
    q.push(vis[ch][cw]);
    ans = 0;
    bool done = false;
    vector<int> visi(color, -1);
    visi[vis[ch][cw]]=0;
    if(vis[ch][cw]==vis[dh][dw]) {
        cout << "0\n";
        return;
    }
    while(!q.empty()) {
        ll top = q.front();
        q.pop();
        for(ll i:adj[top]) {
            if(visi[i]==-1) {
                visi[i]=visi[top]+1;
                q.push(i);
            }
        }
    }
    cout << visi[vis[dh][dw]]<< "\n";
}

signed main() {
    std::ios_base::sync_with_stdio(false);
    ll t=1;
    // cin>>t;
    for(ll i=0; i<t; i++) {
        code();
    }
}


Measured memory_bytes: 148344