#include <bits/stdc++.h>
using namespace std;
//#include "testlib.h"
#define ff first
#define ss second
#define all(v) v.begin(),v.end()
// #define int long long
#define ll int
#define M 1000000007
#define MM 998244353
#define inputarr(a,n) for(int i=0;i<n;++i) cin>>a[i]
#define GCD(m,n) __gcd(m,n)
#define LCM(m,n) m*(n/GCD(m,n))
#define mii  map<ll ,ll >
#define msi  map<string,ll >
#define rep(a,b)    for(ll i=a;i<b;i++)
#define rep0(n)    for(ll i=0;i<n;i++)
#define repi(i,a,b) for(ll i=a;i<b;i++)
#define pb push_back
#define vi vector<ll>
#define vs vector<string>
#define ppb pop_back
#define endl '\n'
#define asdf ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define r0 return 0;
#define FORD(i, a, b) for (int i = (int) (a); i >= (int) (b); --i)
#define inputoutput freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
#define Set(a, s) (a, s, sizeof (a))
#define FOR repi
#define vii vector<pii>
#define pii pair<int,int>
#define REVERSE(v) reverse(all(v))
#define trav(a, x) for(auto& a : x)
#define display(x) trav(a,x) cout<<a<<" ";cout<<endl
#define debug cerr<<"bhau"<<endl
#define trace(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char* name, Arg1&& arg1){
    std::cerr << name << " : " << arg1 << endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args){
    const char* comma = strchr(names + 1, ',');std::cerr.write(names, comma - names) << " : " << arg1<<" | ";__f(comma+1, args...);
}
template<typename T, typename U> static inline void amin(T &x, U y) 
{ 
    if (y < x) 
        x = y; 
}
template<typename T, typename U> static inline void amax(T &x, U y) 
{ 
    if (x < y) 
        x = y; 
}
 
ll max(ll a, ll b) { return (a > b)? a : b;}
int min(int a, int b) { return (a < b)? a : b;} 
const int H=1e3+100;
    string s[H];
    int dp[H][H];
    int h,w;
    int c1,c2;
    int d1,d2;
    typedef  pair<int,pii> mydata;
    inline bool check(int x,int y){
        // trace(x,y);
        return ((x>=0) && x<h && y>=0 && y<w);
    }
int solve(){

    cin>>h>>w;
    cin>>c1>>c2;
    cin>>d1>>d2;
    c1--;
    c2--;
    d1--;
    d2--;
    inputarr(s,h);
    for(int i=0;i<H;i++){
        for(int j=0;j<H;j++) dp[i][j]=1e9;
    }
    priority_queue<mydata,vector<mydata>, greater<mydata>  >q;
    int c=0;
    if(s[c1][c2]=='#') c=1;
    q.push({c,{c1,c2}});
    int dx[]={0,0,1,-1};
    int dy[]={1,-1,0,0};
    dp[c1][c2]=c;
    while(!q.empty()){
        auto cur=q.top();
        // trace(cur.ss.ff,cur.ss.ss,cur.ff);
        if(cur.ss.ff==d1 && cur.ss.ss==d2) return cout<<cur.ff<<endl,0;
        q.pop();
        // trace(1);
        if(dp[cur.ss.ff][cur.ss.ss]!=cur.ff){
            continue;
        }
        int x=cur.ss.ff;
        int y=cur.ss.ss;
        dp[cur.ss.ff][cur.ss.ss]=cur.ff;
        for(int i=0;i<4;i++){
            if(check(x+dx[i],y+dy[i]) && s[x+dx[i]][y+dy[i]]=='.'){
                if(dp[x+dx[i]][y+dy[i]]>cur.ff){
                    dp[x+dx[i]][y+dy[i]]=cur.ff;
                    q.push({cur.ff,{x+dx[i],y+dy[i]}});
                }
            }
        }
        // if(check(x-2,y-2) && check(x-2,y+2),check(x+2,y-2) && check(x+2,y+2));
        // else continue;
        for(int j=-2;j<3;j++){
            for(int k=-2;k<3;k++){
                if(check(x+j,y+k) && dp[x+j][y+k]>cur.ff+1 && s[x+j][y+k]!='#'){
                    dp[x+j][y+k]=cur.ff+1;
                    q.push({cur.ff+1,{x+j,y+k}});
                }
            }
        }
    }   

    cout<<-1;
    return 0;
}
signed main(){
    asdf
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}


Measured memory_bytes: 9492