#include <iostream>
#include <queue>
using namespace std;

const int N = 1010;
char nums[N][N];
int idx[4] = {0, 0, 1, -1};  // 四个方向偏移量
int idy[4] = {1, -1, 0, 0};
bool vis[N][N] = {false};    // 访问标记
int cnt[N][N];               // 记录到每个位置的步数

int main() 
{
    int n, m, x1, y1, x2, y2;
    cin >> n >> m >> x1 >> y1 >> x2 >> y2;
    
    // 输入迷宫(坐标从1开始)
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> nums[i][j];
    
    // 检查起点是否为障碍
    if(nums[x1][y1] == '*') {
        cout << -1 << endl;
        return 0;
    }

    queue<pair<int, int>> q;
    q.push({x1, y1});
    vis[x1][y1] = true;  // 正确标记起点为已访问
    cnt[x1][y1] = 0;     // 初始化起点步数为0

    while(!q.empty())
    {
        int sz = q.size();
        for(int i = 0; i < sz; i++)
        {
            auto x = q.front();
            q.pop();

            // 若到达终点,提前退出
            if (x.first == x2 && x.second == y2) {
                cout << cnt[x2][y2] << endl;
                return 0;
            }

            // 探索四个方向
            for(int k = 0; k < 4; k++)
            {
                int a = x.first + idx[k];
                int b = x.second + idy[k];

                // 检查边界、是否访问过、是否可通行(.表示可走)
                if(a >= 1 && a <= n && b >= 1 && b <= m && !vis[a][b] && nums[a][b] == '.')
                {
                    q.push({a, b});
                    cnt[a][b] = cnt[x.first][x.second] + 1;  // 步数+1
                    vis[a][b] = true;
                }
            }
        }
    }
    
    // 若终点不可达
    cout << -1 << endl;
    return 0;
}