#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

//マクロ
//forループ関係
//引数は、(ループ内変数,動く範囲)か(ループ内変数,始めの数,終わりの数)、のどちらか
//Dがついてないものはループ変数は1ずつインクリメントされ、Dがついてるものはループ変数は1ずつデクリメントされる
#define REP(i,n) for(ll i=0;i<ll(n);i++)
#define REPD(i,n) for(ll i=n-1;i>=0;i--)
#define FOR(i,a,b) for(ll i=a;i<=ll(b);i++)
#define FORD(i,a,b) for(ll i=a;i>=ll(b);i--)
//xにはvectorなどのコンテナ
#define ALL(x) x.begin(),x.end() //sortなどの引数を省略したい
#define SIZE(x) ll(x.size()) //sizeをsize_tからllに直しておく
#define LEN(x) ll(x.length()) //lengthをsize_tからllに直しておく
//定数
#define INF 1000000000000 //10^12:極めて大きい値,∞
#define MOD 1000000007 //10^9+7:合同式の法
#define MAXR 100000 //10^5:配列の最大のrange(素数列挙などで使用)
//略記
#define PB emplace_back //vectorヘの挿入
#define MP make_pair //pairのコンストラクタ
#define F first //pairの一つ目の要素
#define S second //pairの二つ目の要素
#define Umap unordered_map
#define Uset unordered_set

bool is_ok(ll a, ll b, ll h, ll w){
    if(a < 0) return false;
    if(a >= h) return false;
    if(b < 0) return false;
    if(b >= w) return false;
    return true;
}

int main(){
    ll h, w, ch, cw, dh, dw;
    cin >> h >> w;
    cin >> ch >> cw;
    cin >> dh >> dw;
    vector<string> s(h);
    REP(i, h) cin >> s[i];
    queue<pair<ll, ll>> q, temp, next;
    vector<vector<ll>> num(h, vector<ll>(w, -1));
    ch--;
    cw--;
    dh--;
    dw--;
    q.emplace(ch, cw);
    temp.emplace(ch, cw);
    num[ch][cw] = 0;
    while(!temp.empty()){
        while(!q.empty()){
            auto v = q.front();
            q.pop();
            if(v.F == dh && v.S == dw){
                cout << num[v.F][v.S];
                return 0;
            }
            if(is_ok(v.F-1, v.S, h, w)){
                if(s[v.F-1][v.S] == '.' && num[v.F-1][v.S] == -1){
                    q.emplace(v.F-1, v.S);
                    temp.emplace(v.F-1, v.S);
                    num[v.F-1][v.S] = num[v.F][v.S];
                }
            }
            if(is_ok(v.F+1, v.S, h, w)){
                if(s[v.F+1][v.S] == '.' && num[v.F+1][v.S] == -1){
                    q.emplace(v.F+1, v.S);
                    temp.emplace(v.F+1, v.S);
                    num[v.F+1][v.S] = num[v.F][v.S];
                }
            }
            if(is_ok(v.F, v.S-1, h, w)){
                if(s[v.F][v.S-1] == '.' && num[v.F][v.S-1] == -1){
                    q.emplace(v.F, v.S-1);
                    temp.emplace(v.F, v.S-1);
                    num[v.F][v.S-1] = num[v.F][v.S];
                }
            }
            if(is_ok(v.F, v.S+1, h, w)){
                if(s[v.F][v.S+1] == '.' && num[v.F][v.S+1] == -1){
                    q.emplace(v.F, v.S+1);
                    temp.emplace(v.F, v.S+1);
                    num[v.F][v.S+1] = num[v.F][v.S];
                }
            }
        }
        while(!temp.empty()){
            auto v = temp.front();
            temp.pop();
            for(ll i = -2; i <= 2; i++){
                for(ll j = -2; j <=2; j++){
                    if(is_ok(v.F+i, v.S+j, h, w)){
                        if(s[v.F+i][v.S+j] == '.' && num[v.F+i][v.S+j] == -1){
                            q.emplace(v.F+i, v.S+j);
                            next.emplace(v.F+i, v.S+j);
                            num[v.F+i][v.S+j] = num[v.F][v.S] + 1;
                        }
                    }
                }
            }
        }
        // next -> temp
        while(!next.empty()){
            auto v = next.front();
            next.pop();
            temp.emplace(v);
        }
    }
    cout << -1;
    return 0;
}

Measured memory_bytes: 13436