#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
using namespace __gnu_pbds; 
using namespace std;
#define IOS {ios :: sync_with_stdio(false); cin.tie(0);cout.tie(0); }
#define F first
#define S second
#define pb push_back
typedef long double ld;
#define deci(n) cout << fixed << setprecision(n);
typedef long long ll;

#define mem0(x)  memset(x,0,sizeof(x));
#define memm1(x) memset(x,-1,sizeof(x));
#define all(a) a.begin(), a.end()
#define pll pair<ll, ll>
#define bits(x) __builtin_popcount(x)
#define fori(n)  for (ll i = 0; i < n; i++)
#define fori2(n) for(ll i=1;i<=n;i++)
#define forj(n)  for (ll j = 0; j < n; j++)
#define forj2(n) for(ll j=1;j<=n;j++)
#define fork(n)  for (ll k = 0; k < n; k++)
#define fork2(n) for(ll k=1;k<=n;k++)
#define vll vector <ll>
#define mll map <ll, ll>
#define vpll vector <pll>
const ll md = 1e9 + 7;

#define BSET(a, p) ((a) | (1ll << (p)))
#define BCHK(a, p) ((a) & (1ll << (p)))
#define BXOR(a, p) ((a) ^ (1ll << (p)));
#define BREM(a, p) (BCHK(a, p)?(BXOR(a, p)):(a))
#define BSHO(a, N) (bitset<N>(a))
// const ll N = 100005;
// ll fac[N] = {1};
// #define calfac for(ll i=1  ;i<N;i++) fac[i] = (fac[i-1]*i)%md;
// ll C[N+1][M+1]; 
// void  ncr(){
//     ll n = N,k = M; 
//     for (ll i = 0; i <= n; i++) { 
//         for (ll j = 0; j <= min(i, k); j++) { 
//             if (j == 0 || j == i)  C[i][j] = 1; 
//             else C[i][j] = C[i - 1][j - 1] +  C[i - 1][j]; 
//         } 
//     } 
// } 


#define RBTTYPE int
#define ordered_set tree<RBTTYPE, null_type, less<RBTTYPE>, rb_tree_tag,tree_order_statistics_node_update> 
// Ordered set docs:
// order_of_key (k) : Number of items strictly smaller than k .
// find_by_order(k) : K-th element in a set (counting from zero).
ll modexp(ll x, ll ex) {
    ll ans = 1ll;
    while (ex > 0) {
        if (ex & 1ll) ans = (ans * x) % md;
        ex >>= 1ll;
        x = (x * x) % md;
    }
    return ans;
}
ll modInv(ll a)
{
    return pow(a,md-2);
}
 
// ll nCr(ll n,ll r)
// {
//     return (fac[n]*modInv((fac[r]*fac[n-r])%md))%md;
// }

 
ll po(ll x,ll n){
    if(n==0) return 1;
    if(n%2==1) return (x*po(x,n-1));
    else {
        ll k=po(x,n/2);
        return (k*k);
    }
}
 
ll gcd(ll x, ll y) {
    if (x < y) return gcd(y, x);
    if (y == 0) return x;
    return gcd(y, x % y);
}
 
string a[1003];
bool done[1003][1003];
bool done2[1000006];
vll adj[1000006];
ll c[1003][1003];
set<pll> s;
ll n,m,cnt=1;
void dfs(ll x,ll y){
    if(a[x][y]=='#') return ;
    done[x][y] = 1;
    c[x][y] = cnt;
    if(x+1 < n && !done[x+1][y]) dfs(x+1,y);
    if(y+1 < m && !done[x][y+1]) dfs(x,y+1);
    if(x-1 >=0 && !done[x-1][y]) dfs(x-1,y);
    if(y-1 >=0 && !done[x][y-1]) dfs(x,y-1);
    
}
ll dx[] = {-2,-1,0,1,2};
ll dy[] = {-2,-1,0,1,2};
bool ck(ll x,ll y){
    if(x>=0 && x<n && y>=0 && y<m) return 1;
    return 0;
}
int32_t main(){
    IOS;
    ll i,j,k,u,v,x,y;
    cin >> n >> m >> u >> v >> x >> y;
    u--;v--;x--;y--;
    fori(n) cin >> a[i];
    fori(n){
        forj(m){
            if(a[i][j]=='.' && !done[i][j]) {
                dfs(i,j);
                cnt++;
            }
        }
    }
    fori(n){
        forj(m){
            if(a[i][j]=='#') continue;
            fork(5){
                for(ll p=0;p<5;p++){
                    ll xx = i + dx[k];
                    ll yy = j + dy[p];
                    if(xx==i && yy==j) continue;
                    if(ck(xx,yy) && a[xx][yy]=='.'){
                        if(c[xx][yy] != c[i][j]){
                            if(s.find({c[i][j],c[xx][yy]})==s.end()){
                                // cout << c[xx][yy]<<"\n";
                                adj[c[i][j]].pb(c[xx][yy]);
                                adj[c[xx][yy]].pb(c[i][j]);
                                s.insert({c[i][j],c[xx][yy]});
                                s.insert({c[xx][yy],c[i][j]});
                            }
                        }
                    }
                }
            }
        }
    }
    
    // fori(n){
    //     forj(m) cout <<c[i][j] <<" ";
    //     cout <<"\n";
    // }
    queue<ll> q;
    q.push(c[u][v]);
    done2[c[u][v]] = 1;
    ll d = 0;
    while(!q.empty()){
        ll sz = q.size();
        fori(sz){
            ll t = q.front();
            q.pop();
            // cout << t <<"\n";
            if(t==c[x][y]){
                cout << d <<"\n";
                return 0;
            }
            for(auto r : adj[t]){
                if(!done2[r]){
                    done2[r] = 1;
                    q.push(r);
                }
            }
        }
        d++;
    }
    cout << "-1\n";
    

} 

Measured memory_bytes: 67492