#include <iostream>
#include <queue>
#include <utility>
#include <vector>
using namespace std;
typedef pair<int,int> pnt;
struct point{
int x;
int y;
};
int main() {
// 定义迷宫长宽
int n, m;
cin >> n;
cin >> m;
// 输入重点和起点坐标
point ps,pt;
cin >> ps.x;
cin >> ps.y;
cin >> pt.x;
cin >> pt.y;
// 初始化迷宫矩阵 0表示障碍 1表示可通行 2表示已经访问过
vector<vector<int>> vect(n + 2, vector<int>(m + 2, 0));
// 访问数组 默认-1未访问 同时走过距离也用这个矩阵统计
vector<vector<int>> visit(n + 2, vector<int>(m + 2, -1));
// st用于暂存上一次访问的节点,以便回退
queue<pnt> st;
// 循环输入数据
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
char ch;
cin >> ch;
if (ch == '.') vect[i][j] = 1;
}
}
st.push({ps.x,ps.y});
visit[ps.x][ps.y]=0;
// 如果终点不通直接输出-1 结束
if (vect[pt.x][pt.y] == 0) {
cout << -1 << endl;
return 0;
}
// 出栈条件 只有到达目标顶点或者栈空(无路可走) 退出循环
while ((ps.x != pt.x || ps.y != pt.y) && !st.empty()) {
// 出栈一点
auto p=st.front();
ps.x=p.first;ps.y=p.second;
st.pop();
// 出栈进行访问 用ps接受当前
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
for(int i=0;i<4;i++){
//取下一个点
point ptemp;
ptemp.x=ps.x+dx[i];ptemp.y=ps.y+dy[i];
// 判断是否可通行且该点未访问过
if(vect[ptemp.x][ptemp.y]==1&&visit[ptemp.x][ptemp.y]==-1){
st.push({ptemp.x,ptemp.y});
visit[ptemp.x][ptemp.y]=visit[ps.x][ps.y]+1;
if(ps.x == pt.x && ps.y == pt.y) break;
}
}
}
if(ps.x == pt.x && ps.y == pt.y) cout<<visit[pt.x][pt.y]<<endl;
else cout<<-1<<endl;
return 0;
}
// 64 位输出请用 printf("%lld")