#include <bits/stdc++.h>
#define ll long long
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define repi(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++)
#define repm(i, a, b) for (ll i = (ll)(a); i > (ll)(b); i--)
#define all(v) v.begin(), v.end()
#define rall(x) (x).rbegin(), (x).rend()
#define pll pair<long long, long long>
#define pb emplace_back
#define mp make_pair
#define mt make_tuple
#define vc vector<char>
#define vvc vector<vc>
using namespace std;
using vi = vector<int>;
using vvi = vector<vi>;
using vll = vector<long long>;
using vvll = vector<vll>;
using vb = vector<bool>;
using vvb = vector<vb>;
template <class T>bool chmax(T &a, const T &b){if (a < b){a = b;return 1;}return 0;}
template <class T>bool chmin(T &a, const T &b){if (b < a){a = b;return 1;}return 0;}
//snippets:tmp,cl,cvl,cs,co,coy,con,cov,setp



int main(){
    int h;
    cin >> h;
    int w;
    cin >> w;
    int ch;
    cin >> ch;
    int cw;
    cin >> cw;
    int dh;
    cin >> dh;
    int dw;
    cin >> dw;
    vvi s(h,vi(w));
    rep(i,h){
        string st;
        cin>>st;
        rep(j,w){
            if(st[j]=='.') s[i][j]=1;
            else s[i][j]=0;
        }
    }
    vvi d(h,vi(w,-1));
    queue<pair<int,int>> q;
    queue<pair<int,int>> q2;
    vvi check(h,vi(w,0));
    q.push({ch-1,cw-1});
    q2.push({ch-1,cw-1});
    d[ch-1][cw-1]=0;
    while(!q.empty()||!q2.empty()){
        while(!q.empty()){
            ll x=q.front().first;
            ll y=q.front().second;
            q2.push({x,y});
            if(x!=0){
                if(s[x-1][y]) {
                    if(d[x-1][y]==-1||d[x][y]<d[x-1][y]){
                        d[x-1][y]=d[x][y];
                        if(!check[x-1][y]){
                            q.push({x-1,y});
                            q2.push({x-1,y});
                        }
                        check[x-1][y]=1;
                    }
                }
            }
            if(y!=0){
                if(s[x][y-1]) {
                    if(d[x][y-1]==-1||d[x][y]<d[x][y-1]){
                        d[x][y-1]=d[x][y];
                        if(!check[x][y-1]){
                            q.push({x,y-1});
                            q2.push({x,y-1});
                        }
                        check[x][y-1]=1;
                    }
                }
            }
            if(x!=h-1){
                if(s[x+1][y]) {
                    if(d[x+1][y]==-1||d[x][y]<d[x+1][y]){
                        d[x+1][y]=d[x][y];
                        if(!check[x+1][y]){
                            q.push({x+1,y});
                            q2.push({x+1,y});
                        }
                        check[x+1][y]=1;
                    }
                }
            }
            if(y!=w-1){
                if(s[x][y+1]) {
                    if(d[x][y+1]==-1||d[x][y]<d[x][y+1]){
                        d[x][y+1]=d[x][y];
                        if(!check[x][y+1]){
                            q.push({x,y+1});
                            q2.push({x,y+1});
                        }
                        check[x][y+1]=1;
                    }
                }
            }
            q.pop();
            check[x][y]=0;
        }

        if(d[dh-1][dw-1]!=-1) break;
        while(!q2.empty()){
            int x=q2.front().first;
            int y=q2.front().second;
            if(x!=0&&y!=0){
                if(s[x-1][y-1]) {
                    if(d[x-1][y-1]==-1||d[x][y]+1<d[x-1][y-1]){
                        d[x-1][y-1]=d[x][y]+1;
                        if(!check[x-1][y-1]) q.push({x-1,y-1});
                        check[x-1][y-1]=1;
                    }
                }
            }
            if(x!=h-1&&y!=w-1){
                if(s[x+1][y+1]) {
                    if(d[x+1][y+1]==-1||d[x][y]+1<d[x+1][y+1]){
                        d[x+1][y+1]=d[x][y]+1;
                        if(!check[x+1][y+1]) q.push({x+1,y+1});
                        check[x+1][y+1]=1;
                    }
                }
            }
            if(x!=h-1&&y!=0){
                if(s[x+1][y-1]) {
                    if(d[x+1][y-1]==-1||d[x][y]+1<d[x+1][y-1]){
                        d[x+1][y-1]=d[x][y]+1;
                        if(!check[x+1][y-1]) q.push({x+1,y-1});
                        check[x+1][y-1]=1;
                    }
                }
            }
            if(x!=0&&y!=w-1){
                if(s[x-1][y+1]) {
                    if(d[x-1][y+1]==-1||d[x][y]+1<d[x-1][y+1]){
                        d[x-1][y+1]=d[x][y]+1;
                        if(!check[x-1][y+1]) q.push({x-1,y+1});
                        check[x-1][y+1]=1;
                    }
                }
            }
            if(x>1&&y>1){
                if(s[x-2][y-2]) {
                    if(d[x-2][y-2]==-1||d[x][y]+1<d[x-2][y-2]){
                        d[x-2][y-2]=d[x][y]+1;
                        if(!check[x-2][y-2]) q.push({x-2,y-2});
                        check[x-2][y-2]=1;
                    }
                }
            }
            if(x>0&&y>1){
                if(s[x-1][y-2]) {
                    if(d[x-1][y-2]==-1||d[x][y]+1<d[x-1][y-2]){
                        d[x-1][y-2]=d[x][y]+1;
                        if(!check[x-1][y-2]) q.push({x-1,y-2});
                        check[x-1][y-2]=1;
                    }
                }
            }
            if(y>1){
                if(s[x][y-2]) {
                    if(d[x][y-2]==-1||d[x][y]+1<d[x][y-2]){
                        d[x][y-2]=d[x][y]+1;
                        if(!check[x][y-2]) q.push({x,y-2});
                        check[x][y-2]=1;
                    }
                }
            }
            if(x<h-1&&y>1){
                if(s[x+1][y-2]) {
                    if(d[x+1][y-2]==-1||d[x][y]+1<d[x+1][y-2]){
                        d[x+1][y-2]=d[x][y]+1;
                        if(!check[x+1][y-2]) q.push({x+1,y-2});
                        check[x+1][y-2]=1;
                    }
                }
            }
            if(x<(h-2)&&y>1){
                if(s[x+2][y-2]) {
                    if(d[x+2][y-2]==-1||d[x][y]+1<d[x+2][y-2]){
                        d[x+2][y-2]=d[x][y]+1;
                        if(!check[x+2][y-2]) q.push({x+2,y-2});
                        check[x+2][y-2]=1;
                    }
                }
            }
            if(x<(h-2)&&y>0){
                if(s[x+2][y-1]) {
                    if(d[x+2][y-1]==-1||d[x][y]+1<d[x+2][y-1]){
                        d[x+2][y-1]=d[x][y]+1;
                        if(!check[x+2][y-1]) q.push({x+2,y-1});
                        check[x+2][y-1]=1;
                    }
                }
            }
            if(x<(h-2)){
                if(s[x+2][y]) {
                    if(d[x+2][y]==-1||d[x][y]+1<d[x+2][y]){
                        d[x+2][y]=d[x][y]+1;
                        if(!check[x+2][y]) q.push({x+2,y});
                        check[x+2][y]=1;
                    }
                }
            }
            if(x<(h-2)&&y<w-1){
                if(s[x+2][y+1]) {
                    if(d[x+2][y+1]==-1||d[x][y]+1<d[x+2][y+1]){
                        d[x+2][y+1]=d[x][y]+1;
                        if(!check[x+2][y+1]) q.push({x+2,y+1});
                        check[x+2][y+1]=1;
                    }
                }
            }
            if(x<(h-2)&&y<(w-2)){
                if(s[x+2][y+2]) {
                    if(d[x+2][y+2]==-1||d[x][y]+1<d[x+2][y+2]){
                        d[x+2][y+2]=d[x][y]+1;
                        if(!check[x+2][y+2]) q.push({x+2,y+2});
                        check[x+2][y+2]=1;
                    }
                }
            }
            if(x<h-1&&y<(w-2)){
                if(s[x+1][y+2]) {
                    if(d[x+1][y+2]==-1||d[x][y]+1<d[x+1][y+2]){
                        d[x+1][y+2]=d[x][y]+1;
                        if(!check[x+1][y+2]) q.push({x+1,y+2});
                        check[x+1][y+2]=1;
                    }
                }
            }
            if(y<(w-2)){
                if(s[x][y+2]) {
                    if(d[x][y+2]==-1||d[x][y]+1<d[x][y+2]){
                        d[x][y+2]=d[x][y]+1;
                        if(!check[x][y+2]) q.push({x,y+2});
                        check[x][y+2]=1;
                    }
                }
            }
            if(x>0&&y<(w-2)){
                if(s[x-1][y+2]) {
                    if(d[x-1][y+2]==-1||d[x][y]+1<d[x-1][y+2]){
                        d[x-1][y+2]=d[x][y]+1;
                        if(!check[x-1][y+2]) q.push({x-1,y+2});
                        check[x-1][y+2]=1;
                    }
                }
            }
            if(x>1&&y<(w-2)){
                if(s[x-2][y+2]) {
                    if(d[x-2][y+2]==-1||d[x][y]+1<d[x-2][y+2]){
                        d[x-2][y+2]=d[x][y]+1;
                        if(!check[x-2][y+2]) q.push({x-2,y+2});
                        check[x-2][y+2]=1;
                    }
                }
            }
            if(x>1&&y<w-1){
                if(s[x-2][y+1]) {
                    if(d[x-2][y+1]==-1||d[x][y]+1<d[x-2][y+1]){
                        d[x-2][y+1]=d[x][y]+1;
                        if(!check[x-2][y+1]) q.push({x-2,y+1});
                        check[x-2][y+1]=1;
                    }
                }
            }
            if(x>1&&y){
                if(s[x-2][y]) {
                    if(d[x-2][y]==-1||d[x][y]+1<d[x-2][y]){
                        d[x-2][y]=d[x][y]+1;
                        if(!check[x-2][y]) q.push({x-2,y});
                        check[x-2][y]=1;
                    }
                }
            }
            if(x>1&&y>0){
                if(s[x-2][y-1]) {
                    if(d[x-2][y-1]==-1||d[x][y]+1<d[x-2][y-1]){
                        d[x-2][y-1]=d[x][y]+1;
                        if(!check[x-2][y-1]) q.push({x-2,y-1});
                        check[x-2][y-1]=1;
                    }
                }
            }
            q2.pop();
            check[x][y]=0;
        }
    }
    cout<<d[dh-1][dw-1]<<endl;
}


Measured memory_bytes: 15584