#include <bits/stdc++.h> // 引入标准库头文件
using namespace std;

char ditu[1010][1010]; // 定义全局二维字符数组,表示地图
int n, m; // 定义全局变量,表示地图的行数和列数

// 定义广度优先搜索函数,参数为起点和终点坐标
int bfs(pair<int, int> b, pair<int, int> e) {
    queue<pair<int, int>> q; // 创建队列存储待访问的节点
    q.push(b); // 将起点加入队列
    ditu[b.first][b.second] = '*'; // 标记起点已访问
    int res = 0; // 初始化移动步数
    while (!q.empty()) // 当队列不为空时循环
    { 
        int size = q.size(); // 获取当前层的节点数
        while (size--) // 遍历当前层的所有节点,也因此保证了计数器res++的正确性
        { 
            pair<int, int> t = q.front(); // 获取队首节点
            q.pop(); // 弹出队首节点
            if (t == e) 
			  return res; // 如果当前节点为终点,返回移动步数
            else 
			{
                int dx[] = {-1, 0, 1, 0}; // 定义x方向的四个相邻节点偏移量
                int dy[] = {0, 1, 0, -1}; // 定义y方向的四个相邻节点偏移量
                for (int i = 0; i < 4; i++) { // 遍历四个方向
                    int nx = t.first + dx[i]; // 计算相邻节点的横坐标
                    int ny = t.second + dy[i]; // 计算相邻节点的纵坐标
                    if (nx >= 1 && nx <= n && ny >= 1 && ny <= m &&
                            ditu[nx][ny] == '.') { // 如果相邻节点合法且未被访问
                        q.push({nx, ny}); // 将相邻节点加入队列
                        ditu[nx][ny] = '*'; // 标记相邻节点已访问
                    }
                }
            }
        }
        res++; // 移动步数加一
    }
    return -1; // 若无法到达终点,返回-1
}

int main() {
    cin >> n >> m; // 输入地图的行数和列数
    int xs, ys, xt, yt; // 定义起点和终点的坐标
    cin >> xs >> ys >> xt >> yt; // 输入起点和终点的坐标
    for (int i = 1; i <= n; i++) // 遍历地图的每一行
        for (int j = 1; j <= m; j++) // 遍历地图的每一列
            cin >> ditu[i][j]; // 输入地图信息
    pair<int, int> be = {xs, ys}, en = {xt, yt}; // 定义起点和终点的坐标对
    int result = bfs(be, en); // 调用广度优先搜索函数,计算最短路径
    cout << result; // 输出结果
    return 0; // 程序正常结束
}