#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
typedef vector<ll> VLL;
typedef vector<vector<ll>> VVLL;
typedef pair<ll, ll> Pair;
template <class T> T input() {T t; cin>>t; return t;}
#define FOR(i,a,b) for (ll i = a; i < b; i++)
#define REP(i,b) FOR(i,0,b)
#define RFOR(i,a,b) for (ll i = a-1; i >= b; i--)
#define RREP(i,a) RFOR(i,a,0)
#define REPALL(i,x) for (ll i = 0; i < x.size(); i++)
#define RREPALL(i,x) for (ll i = x.size()-1; i >= 0; i--)
#define REPITR(itr,x) for (auto itr = (x).begin(); itr != (x).end(); itr++)
#define ALL(x) (x).begin(), (x).end()
#define SORT(x) sort(ALL(x))
#define MIN_ELEMENT(x) min_element(ALL(x))
#define MAX_ELEMENT(x) max_element(ALL(x))
#define COUNT(x,num) count(ALL(x), num)
#define MEMSET(x,val) memset(x, val, sizeof(x))
#define CHMAX(a,b) a = max(a,b)
#define CHMIN(a,b) a = min(a,b)
#define FIND(x,key) x.find(key) != x.end()
#define IN_RANGE_V2(v,k,x,y) (0<=x+dx[k]&&x+dx[k]<v[y].size()&&0<=y+dy[k]&&y+dy[k]<v.size())
#define debug(x) cerr<<__LINE__<<": "<<(#x)<<" = "<<(x)<<endl;
void YES(bool flag) {cout<<(flag ? "YES" : "NO")<<endl;}
void Yes(bool flag) {cout<<(flag ? "Yes" : "No")<<endl;}
void yes(bool flag) {cout<<(flag ? "yes" : "no")<<endl;}
#define PRINT_ARRAY_H(a) REPALL(__i,a) {cout<<a[__i]<<(__i != a.size()-1 ? " " : "");} newline;
#define PRINT_ARRAY_V(a) REPALL(__i,a) {cout<<a[__i]<<endl;}
#define e1 first
#define e2 second
#define newline putchar('\n')
#define cspace ' '
#define sspace " "
const int INF = 1e7;
const ll MOD = 1e9 + 7;
const double pi = 3.141592653589793;
const VI dx = {1, 0, -1, 0};
const VI dy = {0, 1, 0, -1};
//const VI dx = {1, 1, 0, -1, -1, -1, 0, 1};
//const VI dy = {0, 1, 1, 1, 0, -1, -1, -1};

#define IN_RANGE2(x,y,X,Y) (0<=x&&x<X&&0<=y&&y<Y)

void solve()
{
    ll h, w, ch, cw, dh, dw;
    cin>>h>>w>>ch>>cw>>dh>>dw;
    ch--; cw--; dh--; dw--;
    vector<vector<char>> s(1111, vector<char>(1111, '#'));
    VVI dp(1111, VI(1111, -1));
    deque<Pair> candidate;
    REP(i,h) REP(j,w) cin>>s[i][j];

    candidate.push_back(make_pair(ch, cw));
    dp[ch][cw] = 0;
    ll cnt;
    while (!candidate.empty()) {
        ll th, tw;
        tie(th, tw) = candidate.front();
        candidate.pop_front();
        cnt = dp[th][tw];

        REP(i,4) {
            if (IN_RANGE2(tw+dx[i], th+dy[i], w, h)
            && (dp[th+dy[i]][tw+dx[i]]== -1 || dp[th+dy[i]][tw+dx[i]] > cnt)
            && s[th+dy[i]][tw+dx[i]] == '.') {
                dp[th+dy[i]][tw+dx[i]] = cnt;
                candidate.push_front(make_pair(th+dy[i], tw+dx[i]));
            }
        }

        FOR(y,-2,3) {
            FOR(x,-2,3) {
                if (IN_RANGE2(tw+x, th+y, w, h)
                && (dp[th+y][tw+x]== -1 || dp[th+y][tw+x] > cnt + 1)
                && s[th+y][tw+x] == '.') {
                    dp[th+y][tw+x] = cnt + 1;
                    candidate.push_back(make_pair(th+y, tw+x));

                    if (th+y == dh && tw+x == dw) {
                        break;
                    }
                }
            }
        }
    }
    /* REP(i,h) {
        REP(j,w) {
            cout<<dp[i][j]<<'\t';
        }
        newline;
    }*/
    cout<<dp[dh][dw]<<endl;
}

int main()
{
    cout<<fixed<<setprecision(20);
    int __t = 1;
    //cin>>__t;
    REP(i,__t) {
        solve();
    }
    return 0;
}

Measured memory_bytes: 9920