#include "bits/stdc++.h"
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;

#define ub              upper_bound
#define lb              lower_bound
#define isrt            insert
#define clr             clear
#define rsz             resize
#define ff              first
#define ss              second
#define lli             long long int
#define pb              push_back
#define pf              push_front
#define mkp              make_pair
#define pii             pair<lli,lli>
#define vi              vector<int>
#define mii             map<lli,lli>
#define pqb             priority_queue<int>
#define pqs             priority_queue<int,vi,greater<int> >
#define setbits(x)      __builtin_popcountll(x)
#define zrobits(x)      __builtin_ctzll(x)
#define mod             1000000007
#define INF             1e9
#define ps(x,y)         fixed<<setprecision(y)<<x
#define mk(arr,n,type)  type *arr=new type[n];
#define w(x)            int x; cin>>x; while(x--)
#define all(v)          v.begin(),v.end()
#define endl            "\n"
const double PI = acos(-1);

typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;

lli maxm(lli a, lli b)
{
    return (a >= b ? a : b);
}


lli minm(lli a, lli b)
{
    return (a <= b ? a : b);
}

lli power(lli x, lli y, lli p)
{
    lli res = 1;

    x = x % p;
    if (x == 0)
        return 0;

    while (y > 0)
    {

        if (y & 1)
            res = (res * x) % p;


        y = y >> 1;
        x = (x * x) % p;
    }
    return res;
}

lli nCrmodp(lli n, lli r, lli p)
{
    if (r == 0)
        return 1;
    if (r == 1)
        return n;


    lli pro = 1, k = n;
    while (k > r)
    {
        pro *= k;
        pro %= p;
        --k;
    }

    k = 2;
    while (k <= (n - r))
    {
        pro *= power(k, (p - 2), p);
        pro %= p;
        ++k;
    }

    return pro;
}


lli str_num(string str, lli k)
{

    lli n = str.length(), ans = 0;

    for (lli i = 0; i < n; ++i)
        ans = (k * ans + str[i] - '0');


    return ans;
}


lli first_big(lli n, lli k, vector<lli> arr)
{
    lli l, r, ans = n;
    l = 0;
    r = n - 1;

    while (l <= r) {
        lli m = l + (r - l) / 2;

        if (arr[m] > k) {
            ans = m;
            r = m - 1;
        }

        else
            l = m + 1;
    }

    return ans;
}

lli last_small(lli n, lli k, vector<lli> arr)
{
    lli l, r, ans = -1;
    l = 0;
    r = n - 1;

    while (l <= r)
    {
        lli mid = (l + r) / 2;

        if (arr[mid] <= k)
        {
            ans = mid;
            l = mid + 1;
        }
        else
            r = mid - 1;
    }

    return ans;
}

void c_p_c()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}

int main()
{
    c_p_c();

    int n, m, x1, y1, x2, y2;

    cin >> n >> m >> x1 >> y1 >> x2 >> y2;

    x1--;
    x2--;
    y1--;
    y2--;

    vector<vector<lli>>dis(n, vector<lli>(m, INF));

    string arr[n];
    for (int i = 0; i < n; ++i)
        cin >> arr[i];

    deque<pair<int, pii>> Q;

    pair<int, pii> temp;
    dis[x1][y1] = 0;

    Q.pb({0, {x1, y1}});

    int ans = -1;

    while (!Q.empty())
    {
        temp = Q.front();
        Q.pop_front();

        if (temp.ss.ff == x2 && temp.ss.ss == y2)
        {
            ans = temp.ff;
            break;
        }

        int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, { -1, 0}};

        for (int i = 0; i < 4; ++i)
        {
            int r, c;
            r = temp.ss.ff + dir[i][0];
            c = temp.ss.ss + dir[i][1];

            if (r >= 0 && r < n && c >= 0 && c < m && arr[r][c] != '#')
            {
                if (dis[temp.ss.ff][temp.ss.ss] < dis[r][c])
                {
                    dis[r][c] = dis[temp.ss.ff][temp.ss.ss];
                    Q.push_front({dis[r][c], {r, c}});
                }
            }
        }

        for (int i = -2; i <= 2; ++i)
        {
            for (int j = -2; j <= 2; ++j)
            {
                if (abs(i) + abs(j) <= 1)
                    continue;

                int r, c;

                r = temp.ss.ff + i;
                c = temp.ss.ss + j;

                if (r >= 0 && r < n && c >= 0 && c < m && arr[r][c] != '#')
                {
                    if (dis[temp.ss.ff][temp.ss.ss] + 1 < dis[r][c])
                    {
                        dis[r][c] = 1 + dis[temp.ss.ff][temp.ss.ss];
                        Q.push_back({dis[r][c], {r, c}});
                    }
                }

            }
        }
    }

    cout << ans << endl;

    return 0;
}

Measured memory_bytes: 12736