#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define F first
#define S second
#define IOS ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
int vis[1001][1001];
string s[1001];
bool valid(int x,int y,int n,int m){
    if(x<0 || x>=n || y<0 || y>=m)
        return false;
    if(s[x][y]=='#')
        return false;
    // if(vis[x][y])
    //     return false;
    return true;
}
bool valid2(int x,int y,int n,int m){
    if(x<0 || x>=n || y<0 || y>=m)
        return false;
    if(s[x][y]=='#')
        return false;
    // if(vis[x][y])
    //     return false;
    return true;
}
int magic[1001][1001];
void solve(){
    int h,w;
    cin>>h>>w;
    int ch,cw,dh,dw;
    cin>>ch>>cw>>dh>>dw;
    ch--;
    cw--;
    dh--;
    dw--;
    
    for(int i =0;i<h;i++){
        cin>>s[i];
    }
    ll dis[h][w];
    for(int i =0;i<h;i++){
        for(int j = 0;j<w;j++){
            dis[i][j] = INT_MAX;
        }
    }
    deque<pair<int,int> > q;
    q.push_back({ch,cw});
    dis[ch][cw] = 0;
    vis[ch][cw] = 1;
    bool found = false;
    while(!q.empty()){
        int curx,cury;
        curx = q.front().F;
        cury = q.front().S;
        q.pop_front();
        // cout<<curx<<" "<<cury<<'\n';
        // if(curx==dh && cury==dw){
        //     found  = true;
        //     break;
        // }
        //go left
        
        if(valid(curx,cury+1,h,w)){
            vis[curx][cury+1] = 1;
            if(dis[curx][cury + 1] > dis[curx][cury]){
            dis[curx][cury + 1] = dis[curx][cury];
            q.push_front({curx,cury+1});
            }
            
            }
            //go right
        
        if(valid(curx,cury-1,h,w)){
            vis[curx][cury-1] = 1;
            if(dis[curx][cury - 1] > dis[curx][cury]){
            dis[curx][cury - 1] = dis[curx][cury];
           q.push_front({curx,cury-1});
            }
        }
            //go up
            
        if(valid(curx-1,cury,h,w)){
            vis[curx-1][cury] = 1;
            if (dis[curx - 1][cury ] > dis[curx][cury]){
                dis[curx - 1][cury ] = dis[curx][cury];
                q.push_front({curx-1,cury});
            }
        }
            //go down
        
        
        if(valid(curx+1,cury,h,w)){
            vis[curx+1][cury] = 1;
            if(dis[curx+1][cury]>dis[curx][cury] ){
                dis[curx + 1][cury] = dis[curx][cury];
                q.push_front({curx+1,cury});
            }
        }
        int i , j;
        for(i = max(curx-2,0) ;i<=min(curx+2,h-1);i++){
            for(j = max(cury-2,0);j<=min(cury+2,w-1);j++){
                if(valid2(i,j,h,w)){
                    vis[i][j] = 1;
                    if(dis[i][j] > dis[curx][cury] + 1){
                        dis[i][j] = dis[curx][cury] + 1;
                        q.push_back({i,j});
                    }

                }
            }
        }
    }
    // for(int i = 0;i<h;i++){
    //     for(int j = 0;j<w;j++){
    //         cout<<vis[i][j];
    //     }
    //     cout<<'\n';
    // }
    if(dis[dh][dw]==INT_MAX)
        cout<<"-1\n";
    else
    {
        cout<<dis[dh][dw]<<" \n";
    }
    
}
int main(){
    IOS;
    int tt;
    tt = 1;
    // cin>>tt;
    while(tt--){
        solve();
    }
    return 0;
}


Measured memory_bytes: 16544