#include<bits/stdc++.h>
using namespace std;

#define N 1001

struct Node {
    int x,y;
};
deque<Node>q;
int sx,sy,tx,ty;
int n,m,dis[N][N];
int dx[4]= {1,-1,0,0};
int dy[4]= {0,0,1,-1};

char str[N][N],vis[N][N];

int main(void) {
    int i,dir,j;
    Node x,y;
    memset(dis,0x3f,sizeof dis);
    scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);
    for(i=1; i<=n; ++i)
		scanf("%s",str[i]+1);
    q.push_back({sx,sy});
	dis[sx][sy]=0;
    while(!q.empty()) {
        x=q.front();
		q.pop_front();
        if(vis[x.x][x.y])continue;
        vis[x.x][x.y]=1;
        for(dir=0; dir<4; ++dir) {
            y= {x.x+dx[dir],x.y+dy[dir]};
            if(y.x&&y.x<=n&&y.y&&y.y<=m&&str[y.x][y.y]^'#'&&dis[y.x][y.y]>dis[x.x][x.y])
				dis[y.x][y.y]=dis[x.x][x.y],q.push_front(y);
        }
        for(i=-2; i<=2; ++i) {
            for(j=-2; j<=2; ++j) {
                y= {x.x+i,x.y+j};
                if(y.x>=1&&y.x<=n&&y.y>=1&&y.y<=m&&str[y.x][y.y]^'#'&&dis[y.x][y.y]>dis[x.x][x.y]+1)
					dis[y.x][y.y]=dis[x.x][x.y]+1,q.push_back(y);
            }
        }
    }
    printf("%d\n",dis[tx][ty]^0x3f3f3f3f?dis[tx][ty]:-1);
}