#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")