#include<bits/stdc++.h>
#include<queue>
using namespace std;
 
#define what_is(x) cout << #x << " is " << x << endl; 
#define PI acos(-1)
#define hell 1000000007
#define HELL 998244353
#define io ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define fix(n) cout << fixed << setprecision(n)
#define mset(a,n) memset(a,n,sizeof a)
#define rep(i,a,b) for (__typeof((b)) i=(a);i<(b);i++)
#define repp(i,a,b,p) for(__typeof((b)) i=(a);i<(b);i+=p)
#define ren(i,a,b) for(__typeof((a)) i=(a);i>=(b);i--)
#define renn(i,a,b,p) for(__typeof((a) i=(a);i>=(b);i-=p)
#define ADD(a,b,c) ((a)%c+(b)%c)%c
#define SUB(a,b,c) ((a)%c-(b)%c+c)%c
#define MUL(a,b,c) (((a)%c)*((b)%c))%c
#define lbd lower_bound
#define ubd upper_bound
#define ll long long
#define ld long double
#define pb push_back
#define fi first
#define se second
#define vll vector<ll>
#define pll pair<ll,ll>
#define vpll vector<pll>
#define all(v) (v).begin(), (v).end()
#define sz(x) (ll)x.size()
// #define out(n) cout<<n<<" "
#define outl(n) cout<<n<<endl
#define bug(n) {outl(n);return;}
#define pii pair<int,int>
#define lim 9223372036854775805
#define ninf -9223372036854775802
#define M 1000000007
#define eps 1e-9
#define MAX 5
#define N 500001
#define db(a) for(auto it:a) {cout<<it<<" ";}cout<<endl;
ll prime[MAX]; 
ll fact[MAX];

const long long INF64 = 1e18;
ll vpow(ll a,ll b,ll p){
    if(b==0)
        return 1;
    if(b==1)
            return a;
    ll temp=vpow(a,b/2,p);
    temp*=temp;
    temp%=p;
    if(b%2==0)
        return temp;
    temp=temp*a;
    temp%=p;
    return temp;
}

ll gcd(ll a,ll b){
     if(a==0)
         return b;
     return gcd(b%a,a);
 }

 
ll inverseMod(ll a,ll b,ll p){
    if(b==0)
        return 1;
    ll temp=vpow(b,p-2,p);
    ll ans=temp*a;
    ans%=p;
    return ans;
}
void sieve() 
{ 
    prime[0] = prime[1] = 1; 
    for (ll i = 2; i < MAX; i++) { 
        if (prime[i] == 0) {
            for (int j = i * 2; j < MAX; j += i) { 
                if (prime[j] == 0) { 
                    prime[j] = i; 
                } 
            } 
            prime[i] = i; 
        } 
    } 
}

void factorial(){
    fact[0]=1;
    fact[1]=1;
    rep(i,2,MAX){
        fact[i]=(fact[i-1]*i);
        // fact[i]%=M;
    }
}
ll dd[2][4]={{1,0,-1,0},{0,1,0,-1}};
void dfs(vector<string>&a,ll x,ll y,ll ex,ll ey,vector<vll> &dist,queue<pll> &q,ll d){
	dist[x][y]=d;
	a[x][y]='#';
	q.push({x,y});
	if(x==ex && y==ey){
		return ;
	}
	// cout<<"THis is "<<x+1<<" "<<y+1<<endl;
	ll n=sz(a),m=sz(a[0]);
	// ll &val=dist[x][y];
	// if(val!=-1)
	// 	return val;
	// rec[x][y]=true;
	// val=INT_MAX;
	// ll temp=val;
	rep(k,0,4){
		ll xx=x+dd[0][k],yy=y+dd[1][k];
		if(xx>=0 && xx<n && yy>=0 && yy<m && a[xx][yy]=='.'){
			dfs(a,xx,yy,ex,ey,dist,q,d);
		}
	}
	// if(temp!=INT_MAX)
	// {
	// 	val=temp;
	// 	// rec[x][y]=false;
	// 	// return val;
	// }
	// temp=INT_MAX;
	// rep(i,-2,3){
	// 	rep(j,-2,3){
	// 		// what_is(i);
	// 		// what_is(j);
	// 		ll xx=x+i,yy=y+j;
	// 		if(xx==x && yy==y)
	// 			continue;
	// 		if(xx>=0 && xx<n && yy>=0 && yy<m && a[xx][yy]=='.' && !rec[xx][yy]){
	// 			temp=min(temp,dfs(a,xx,yy,ex,ey,dist,rec));
	// 		}
	// 	}
	// }
	// if(temp!=INT_MAX)
	// 	val=min(val,1+temp);
	// rec[x][y]=false;
	// return val;

}
void solve(ll ttt){
	ll h,w;
	cin>>h>>w;
	ll sx,sy,ex,ey;
	cin>>sx>>sy>>ex>>ey;
	sx--;sy--;ex--;ey--;
	vector<string> a(h);
	rep(i,0,h)
		cin>>a[i];
	vector<vector<ll> > dist(h,vll(w,-1));
	queue<pll> q;
	ll d=0;
	dfs(a,sx,sy,ex,ey,dist,q,d);
	while(!q.empty()){
		ll n=sz(q);
		d++;
		while(n--){
			pll temp=q.front();
			q.pop();
			if(temp.fi==ex && temp.se==ey){
				cout<<dist[ex][ey]<<endl;
				return ;
			}
			rep(i,-2,3){
				rep(j,-2,3){
					// what_is(i);
					// what_is(j);
					ll xx=temp.fi+i,yy=temp.se+j;
					if(xx==temp.fi && yy==temp.se)
						continue;
					if(xx>=0 && xx<h && yy>=0 && yy<w && a[xx][yy]=='.'){
						dfs(a,xx,yy,ex,ey,dist,q,d);
					}
				}
			}

		}
		
	}
	cout<<-1<<endl;
	return ;
	// ans=dist[sx][sy];
	cout<<"THis is dist "<<endl;
	for(int i=0;i<h;i++){
		db(dist[i]);
		cout<<endl;
	}
	// if(ans==INT_MAX)
	// 	ans=-1;
	// cout<<ans<<endl;
}

int main(){
    io;
   
    // sieve();
    // factorial();
#ifndef ONLINE_JUDGE
    freopen("input1.txt","r",stdin);
   // freopen("output1.txt","w",stdout);
#endif
    ll t=1;
    // cin>>t;
    fix(12);
    rep(q,1,t+1){
        // cout<<"Case #"<<q<<": ";
         solve(q);
        //solve2();
    }
    return 0;
    
}


Measured memory_bytes: 12732