#include <bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
/*
    s.find_by_order(k) ---> returns iterator to the element at index(from 0) k
    s.order_of_key(val) ---> number of elements that are strictly smaller than the given value
*/
typedef long long int ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<long long int> vl;
typedef vector<vector<int>> vvi;
typedef vector<vector<long long int>> vvl;
typedef pair<int, int> pii;
typedef pair<long long int, long long int> pll;
typedef vector<pair<int, int>> vii;
typedef vector<pair<long long int, long long int>> vll;
#define fastIO() ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define test() long long int tc; cin >> tc; cin.ignore(); while(tc--) 
#define ff first
#define ss second
#define pb push_back
#define pf push_front
#define mp make_pair
#define MOD 1000000007
#define SMOD 998244353
#define HASH 18014398241046527
#define pq priority_queue
#define all(x) x.begin(),x.end()
#define SP(x) setprecision(x)
#define sp " "
#define inp(a) ll a;cin>>a;cin.ignore()
#define inps(a,b) ll a,b;cin>>a>>b;cin.ignore()
#define out(a) cout<<SP(20)<<a<<'\n'
#define outs(a,b) cout<<SP(20)<<a<<" "<<b<<'\n'
#define ins insert
#define er erase
#define lb lower_bound
#define ub upper_bound
#define printclock cerr<<"Time : "<<1000*(ld)clock()/(ld)CLOCKS_PER_SEC<<"ms\n";
#define inpa(a,n) ll a[n]; for(int i=0; i<n; i++){cin>>a[i];}
#define inpv(a,n) vl a; for(int i=0; i<n; i++){inp(x);a.pb(x);}
#define outa(a,n) for(int i=0;i<n;i++){cout<<a[i]<<" ";}cout<<'\n';
#define outv(v) for(auto i:v){cout<<i<<" ";}cout<<'\n';
set<char> vow = {'a','e','i','o','u','A','E','I','O','U'};
ll xpow(ll n, ll m){if(m==0){return 1;}else{ll x = xpow(n, m/2);if(m&1){return x*x*n;}else{return x*x;}}}
ll xmod(ll a, ll m){return (((a%m)+m)%m);}
ll xmodpow(ll n, ll m, ll y){if(m==0){return 1;}else{ll x = xmodpow(n, m/2, y);if(m&1){return xmod((xmod((xmod(x,y)*xmod(x,y)),y)*xmod(n,y)),y);}else{return xmod((xmod(x,y)*xmod(x,y)),y);}}}
template <typename T>
ll SIZEOF(T a){return (ll)a.size();}
ll xlcm(ll a, ll b){return (a/__gcd(a, b))*b;}

ll dx[] = {1, 0, -1, 0};
ll dy[] = {0, 1, 0, -1};


const int N = 1005;

ll a[N][N];

bool vis[N][N];

ll dis[N][N];

ll n, m;

bool iscell(ll i, ll j){
    if(i>n||i<1||j>m||j<1){
        return 0;
    }
    return a[i][j];
}

void SOLVE(){
    cin >> n >> m;
    ll x, xx, y, yy;
    cin >> x >> y >> xx >> yy;
    for(ll i=1; i<=n; i++){
        string s;
        cin >> s;
        for(ll j=1; j<=m; j++){
            if(s[j-1]=='.'){
                a[i][j] = 1;
            }
            dis[i][j] = 1e18;
        }
    }
    priority_queue <pair <ll, pll>, vector <pair <ll, pll>>, greater<pair <ll, pll>>> q;
    q.push({0, {x, y}});
    dis[x][y] = 0;
    while(!q.empty()){
        pair <ll, pll> p = q.top();
        ll i = p.ss.ff;
        ll j = p.ss.ss;
        q.pop();
        if(vis[i][j]){
            continue;
        }
        vis[i][j] = 1;
        for(int k=0; k<4; k++){
            ll ii = i+dx[k];
            ll jj = j+dy[k];
            if(iscell(ii, jj)){
                if(vis[ii][jj]){
                    continue;
                }
                if(dis[i][j]<dis[ii][jj]){
                    dis[ii][jj] = dis[i][j];
                    q.push({dis[ii][jj], {ii, jj}});
                }
            }
        }
        for(ll addx=-2; addx<=2; addx++){
            for(ll addy=-2; addy<=2; addy++){
                ll ii = i+addx;
                ll jj = j+addy;
                if(iscell(ii, jj)){
                    if(vis[ii][jj]){
                        continue;
                    }
                    if(dis[i][j]+1<dis[ii][jj]){
                        dis[ii][jj] = dis[i][j]+1;
                        q.push({dis[ii][jj], {ii, jj}});
                    }
                }
            }
        }
    }
    if(vis[xx][yy]){
        cout << dis[xx][yy] << '\n';
    }
    else{
        cout << -1 << '\n';
    }
}

int main() {
	fastIO();
	// #ifndef ONLINE_JUDGE
    //     freopen("i.txt", "r", stdin);
    //     freopen("o.txt", "w", stdout);
	// #endif

    ll TC = 1;
    // cin >> TC;
    for(ll tc1=1; tc1<=TC; tc1++){
        // cout << "Case #" << tc1 << ": ";
        SOLVE();
    }
    printclock;
}

Measured memory_bytes: 20544