#include <bits/stdc++.h>
using namespace std;

#define Darr(x)           \
    cerr << #x << " = ";  \
    for (auto i : x)      \
        cerr << i << " "; \
    cerr << "\n";
#define ar array
#define pr pair
#define vt vector
#define pb push_back
#define all(c) (c).begin(), (c).end()
#define sz(x) (int)(x).size()

#define F_OR(i, a, b, s) for (int i = (a); (s) > 0 ? i < (b) : i > (b); i += (s))
#define F_OR1(e) F_OR(i, 0, e, 1)
#define F_OR2(i, e) F_OR(i, 0, e, 1)
#define F_OR3(i, b, e) F_OR(i, b, e, 1)
#define F_OR4(i, b, e, s) F_OR(i, b, e, s)
#define GET5(a, b, c, d, e, ...) e
#define F_ORC(...) GET5(__VA_ARGS__, F_OR4, F_OR3, F_OR2, F_OR1)
#define FOR(...)       \
    F_ORC(__VA_ARGS__) \
    (__VA_ARGS__)
#define EACH(x, a) for (auto &x : a)

template <class A>
void read(vt<A> &v);
template <class A, size_t S>
void read(ar<A, S> &a);
template <class T>
void read(T &x)
{
    cin >> x;
}
void read(double &d)
{
    string t;
    read(t);
    d = stod(t);
}
void read(long double &d)
{
    string t;
    read(t);
    d = stold(t);
}
template <class H, class... T>
void read(H &h, T &... t)
{
    read(h);
    read(t...);
}
template <class A>
void read(vt<A> &x)
{
    EACH(a, x)
    read(a);
}
template <class A, size_t S>
void read(array<A, S> &x)
{
    EACH(a, x)
    read(a);
}
string to_string(char c)
{
    return string(1, c);
}
string to_string(bool b)
{
    return b ? "yes" : "no";
}
string to_string(const char *s)
{
    return string(s);
}
string to_string(string s)
{
    return s;
}
string to_string(vt<bool> v)
{
    string res;
    FOR(sz(v))
    res += char('0' + v[i]);
    return res;
}

template <size_t S>
string to_string(bitset<S> b)
{
    string res;
    FOR(S)
    res += char('0' + b[i]);
    return res;
}
template <class T>
string to_string(T v)
{
    bool f = 1;
    string res;
    EACH(x, v)
    {
        if (!f)
            res += ' ';
        f = 0;
        res += to_string(x);
    }
    return res;
}

template <class A>
void write(A x)
{
    cout << to_string(x) << " ";
}
template <class H, class... T>
void write(const H &h, const T &... t)
{
    write(h);
    write(t...);
}
void print()
{
    cout << ("\n");
}
template <class H, class... T>
void print(const H &h, const T &... t)
{
    write(h);
    if (sizeof...(t))
        write(' ');
    print(t...);
}

void deb() { cerr << endl; }

template <typename Head, typename... Tail>
void deb(Head H, Tail... T)
{
    cerr << to_string(H) << " ";
    deb(T...);
}

using ll = long long;

pair<const int, const int> dxdy[4] = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};

vt<pair<const int, const int>> diag;

const int MxN = 1e6 + 5;
vt<pair<int, int>> adj[MxN];
vt<int> d(MxN, INT32_MAX);

void solve()
{
    for (int i = -2; i <= 2; i++)
    {
        for (int j = -2; j <= 2; j++)
        {
            int ok = 0;
            for (auto [x, y] : dxdy)
            {
                ok |= (i == x && j == y);
            }
            if (!ok && (i || j))
                diag.pb({i, j});
        }
    }
    //  /  for(auto [x,y]:diag){write(x,y);print();}
    // write(diag.size());

    int h, w, stx, sty, enx, eny;
    read(h, w, stx, sty, enx, eny);
    --stx,--sty,--enx,--eny;
    vt<vt<char>> mat(h, vt<char>(w));
    read(mat);

    auto valid = [&](int x, int y) {
        return (x < h && x >= 0 && y < w && y >= 0 && mat[x][y] == '.');
    };
    auto conv = [&](int x,int y){
        return (x + y*(h));
    };/* 
    FOR(h){write(mat[i]);print();} */
    FOR(h)
    {
        FOR(j, w)
        {
            if(valid(i,j)){
            for (auto [x, y] : dxdy)
            {
                if (valid(i + x, y + j))
                {
                    adj[conv(i,j)].pb({conv(i+x,y+j), 0});
                }
            }
            for(auto [x,y]:diag){
                if(valid(i+x,y+j)){
                    adj[conv(i,j)].pb({conv(i+x,y+j),1});
                }
            }
            }
        }
    }
    
    deque<int> q;

    q.push_front(conv(stx,sty));
    d[conv(stx,sty)]=0;
//   /  for(auto [x,y]:adj[0])write(x);
    // /write(conv(enx,eny));

    while (!q.empty())
    {
        int v = q.front();
        //if(v = conv(enx,eny))break;
        //int wt = q.s`econd;
        q.pop_front();
        for (auto [u, w] : adj[v])
        {
            if (d[v] + w < d[u])
            {
               // write("asdkjajsd");
                d[u] = d[v] + w;
                if (w == 1)
                    q.push_back(u);
                else
                    q.push_front(u);
            }


        }
    }
   write((d[conv(enx,eny)]==INT32_MAX?-1:d[conv(enx,eny)]));
  /*  FOR(conv(4,4)+1){
       cout<<i<<"=====>>>>>>";
       for(auto [x,y]:adj[i]){cout<<x<<" ";}
    cout<<"\n";
   } */
    /* FOR(21){
        write(i,d[i]);print();
    } */
//    write(d[conv(1,1)]);

}
int32_t main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    // /freopen("output.txt", "w", stdout);
#endif

    int tc = 1;

    //UNCOMMENT FOR TEST CASE
    //cin >> tc;
    FOR(tc)
    {
        //write("Case #", i+1, ": ");
        solve();
    }
}


Measured memory_bytes: 101252