//triedodin
#include<bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp> 
#include <ext/pb_ds/assoc_container.hpp> 
using namespace std;
using namespace __gnu_pbds;
#define mem(a, b) memset(a, (b), sizeof(a))
#define all(cont) cont.begin(), cont.end()
#define pb push_back
#define PI 3.1415926535897932384626433832795
#define mod1 1000000007
#define mod2 998244353
#define ll long long int
#define ld long double 
#define inf LLONG_MAX
#define endl "\n"
#define F first
#define S second
#define inp(a) int a;cin>>a;
#define inpa(a,n)vector<int> a(n);for(int i = 0; i<n; i++)cin>>a[i];
const double pi=acos(-1.0);
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds; //greater<int> can also be used
#define printclock cerr<<"Time : "<<1000*(ld)clock()/(ld)CLOCKS_PER_SEC<<"ms\n";
#define sz(c) (int)c.size()
#define d1(x)            cout<<#x<<"="<<x<<endl;
#define d2(x,y)          cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl;
#define d3(x,y,z)        cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl;
#define d4(x,y,z,w)      cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<" "<<#w <<"="<<w<<endl;
#define da(arr,j,n)  for(int i=j;i<n;i++) {cout<<"i="<<i<<" arr[i]="<<arr[i]<<"\n";} 

const  ll MODA =                         1000000007;
// const  int MODA =                     998244353 ;
vector<ll> primefactors    ;            // used by generatePrimeFactors()                                                                                   // ARRAYS/VECTORS
vector<ll> factors         ;            // used by generateFactors()
ll   fact[1025]={}         ;            // used by generateFactorial() & ncr()
bool isPowerTwo(ll x)                   { return (x && !(x & (x - 1))); }                                                                                    // FUNCTIONS
ll   modmul(ll a,ll b)                  { return((a%MODA)*(b%MODA))%MODA;     }
ll   modadd(ll a,ll b)                  { return((a%MODA)+(b%MODA)+MODA)%MODA;}
ll   modsub(ll a,ll b)                  { return((a%MODA)-(b%MODA)+MODA)%MODA;}
bool isSubstring(string s1, string s2)  { if (s1.find(s2) != string::npos) return true; else return false; }
void generateFactorial(ll n)            { fact[0] = 1; for(ll i = 1; i <= n; i++)   fact[i] = (i* 1ll * fact[i - 1]) ; }
void generateFactorialMOD(ll n)         { fact[0] = 1; for(ll i = 1; i <= n; i++)   fact[i] = (i* 1ll * fact[i - 1]) % MODA; }
bool isPrime(ll n)                      { if(n<2) return false; for(ll i=2;i*i<=n;i++) if(n%i==0) return false; return true; } //O(sqrt(n))
ll   power(ll a, ll b)                  {   ll res=1; while(b) {    if(b&1) res=(res*a); a=(a*a);   b>>=1;  }   return res; }
ll   powermod(ll a, ll b)               {   ll res=1; while(b) {    if(b&1) res=(res*a)%MODA; a=(a*a)%MODA;     b>>=1;  }   return res; }
ll   modi (ll a)                        { ll m=MODA,s=1,p=0;  while(a>1)  {  ll q=a/m,t=m;  m=a%m; a=t; t=p; p=s-q*p; s=t;  } return s>=0 ? s :s+MODA; }
void generatePrimeFactors(ll n)         { primefactors.clear(); for(ll i=2;i*i<=n;i++) { if(n%i==0) { primefactors.pb(i); while(n%i==0)  n=n/i; } } if(n!=1)   primefactors.pb(n); }
ll   ncr(ll n, ll r)                    { if(r==0)return 1;  fact[0]=1; for(int i=1 ; i<=n; i++) fact[i] = fact[i-1]*i%MODA;   return (fact[n]* modi(fact[r]) % MODA *  modi(fact[n-r]) % MODA) % MODA; }
void generateFactors(ll n)              { factors.clear(); for(ll i=2;i*i<=n;i++){ if(n%i==0) { factors.pb(i); if(n/i!=i)factors.pb(n/i); }} factors.pb(1); factors.pb(n); sort(factors.begin(),factors.end()); }
ld   Logn(ld n, ld r)                   { return log(n) / log(r); }  

///////////////////////////////////
const int Nmax = 1000005;
int r,c, sx,sy, dex, dey;
char ar[1005][1005];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int dis[1005][1005];
////////////////////////////////////

bool isValid(int x, int y){


    if(x < 0 || x >= r || y < 0 || y >= c)
        return false;

    if(ar[x][y] == '#')
        return false;

    return true;

}

void bfs(int srcx, int srcy){

    deque<pair<int,int>> q;
    q.push_front({srcx, srcy});
    dis[srcx][srcy] = 0;
    

    while(!q.empty()){
        int curx = q.front().first;
        int cury = q.front().second;

        q.pop_front();
        //  d2(curx, cury);
        for(int i = 0; i< 4; i++){
            if(isValid(curx+dx[i], cury+dy[i])){
                int newx  = curx + dx[i];
                int newy = cury + dy[i];

                if(dis[newx][newy] > dis[curx][cury]){
                dis[newx][newy] = dis[curx][cury];
                
                q.push_front({newx, newy});
            }
            }
        }

        for(int i = -2; i<=2; i++){
            for(int j = -2; j<=2; j++){
                if(isValid(curx+i, cury +j)){
                     
                     int newx  = curx + i;
                    int newy = cury + j;

                if(dis[newx][newy] > 1 + dis[curx][cury]){
                dis[newx][newy] = 1 + dis[curx][cury];
                
                q.push_back({newx, newy});
            }

                }
            }
        }
    }

}


void solve(){

    
    cin >> r>> c >> sx >> sy >> dex >> dey;

    for(int i = 0; i< r; i++){
        for(int j =0; j< c; j++){
            cin >> ar[i][j];
            dis[i][j] = 1000000000;
        }
    }
    //cout << ar[r-1][c-1] << endl;
    //return;
    bfs(sx-1, sy-1);
    /*for(int i = 0; i< r; i++){
        for(int j =0; j< c; j++){
            cout << dis[i][j] << " ";
        }
        cout << endl;
    }*/
    if(dis[dex-1][dey-1] == 1000000000){
        cout << -1 << endl;
    }
    else{
        cout << dis[dex-1][dey-1] << endl;
    }

}

int main(){
    #ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif
        ios_base::sync_with_stdio(false); cin.tie(0);
     

        int t= 1;
        //cin >> t;

        while(t--){
            solve();
        }

        printclock;
    

  }

/////////////////////////////
//try to bring as much symmetry as possible
//just check for integer overflow
//add MOD value when you substract two numbers
//clear globally declared vectors after each test case 
/////////////////////////////

Measured memory_bytes: 8880