#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <iterator>
#include <math.h>
#include <bits/stdc++.h>
#define ll long long int
#define ull unsigned long long int
#define pb push_back
#define dd double
#define mp make_pair
#include <algorithm>
#include <cmath>
using namespace std;
int main()
{
    // ios_base::sync_with_stdio(false);
    // cin.tie(NULL);
    // int T,p;
    // cin>>T;
    // for(p=1;p<=T;p++)
    // {
        ll N,W;
        cin>>N>>W;
        // string s[H];
        ll i,j,k,a,b,c;
        char ch[N][W];
        bool x[N][W];
        ll s1,e1,s2,e2;
        cin>>s1>>e1>>s2>>e2;
        for(i=0;i<N;i++)
        {
          for(j=0;j<W;j++)
          {
            cin>>ch[i][j];
            // ch1[i][j]='0';
            x[i][j]=false;
          }
        }
        // applying bfs for destination;
        queue <pair <ll,ll> > q;
        q.push(mp(s1-1,e1-1));
        ll count;
        
        // vect.pb(mp(s1-1,e1-1));
        count=0;
        while(x[s2-1][e2-1]==false)
        {
          vector <pair <ll,ll> > vect;
        while(q.size()!=0)
        {
          a=(q.front()).first;
          b=(q.front()).second;
          
          vect.pb(mp(a,b));
          q.pop();
          x[a][b]=true;
          // cout<<a<<" "<<b<<"\n";
          // up jana;
          if(a>=1)
          {
            if((x[a-1][b]==false)&&(ch[a-1][b]=='.'))
            {
              q.push(mp(a-1,b));
              x[a-1][b]=true;
              // vect.pb(mp(a-1,b));
              // ch1[a-1][b]='1';
            }
          }
          // down jana;
          if(a<N-1)
          {
            if((x[a+1][b]==false)&&(ch[a+1][b]=='.'))
            {
              q.push(mp(a+1,b));
              // vect.pb(mp(a+1,b));
              x[a+1][b]=true;
              // ch1[a+1][b]='1';
            }
          }
          // right jana;
          if(b<W-1)
          {
            if((x[a][b+1]==false)&&(ch[a][b+1]=='.'))
            {
              q.push(mp(a,b+1));
              x[a][b+1]=true;
              // vect.pb(mp(a,b+1));
              // ch1[a][b+1]='1';
            }
          }
          // left jana;
          if(b>=1)
          {
            if((x[a][b-1]==false)&&(ch[a][b-1]=='.'))
            {
              q.push(mp(a,b-1));
              x[a][b-1]=true;
              // vect.pb(mp(a,b-1));
              // ch1[a][b-1]='1';
            }
          }
        }
        if(x[s2-1][e2-1])
        break;
        count++;
        // cout<<vect.size()<<" check\n";
        for(i=0;i<vect.size();i++)
        {
          a=vect[i].first;
          b=vect[i].second;
          // upar check kr lo bhaisahab;
          for(j=a-1;j>=max((ll)0,a-2);j--)
          {
            for(k=max((ll)0,b-2);k<=min(W-1,b+2);k++)
            {
             if((ch[j][k]=='.')&&(x[j][k]==false))
              {
                q.push(mp(j,k));
              // cout<<"jai\n";
                x[j][k]=true;
             }
            }
          }
          // neeche dekho;
          for(j=a+1;j<=min(N-1,a+2);j++)
          {
            for(k=max((ll)0,b-2);k<=min(W-1,b+2);k++)
            {
             if((ch[j][k]=='.')&&(x[j][k]==false))
             {
               q.push(mp(j,k));
              // cout<<"jai\n";
                x[j][k]=true;
             }
            }
          }
          // right me dekho;
          for(j=b;j<=min(W-1,b+2);j++)
          {
            if((ch[a][j]=='.')&&(x[a][j]==false))
            {
              q.push(mp(a,j));
              // cout<<"jai\n";
              x[a][j]=true;
            }
          }
          // left me dekho;
          for(j=b;j>=max((ll)0,b-2);j--)
          {
            if((ch[a][j]=='.')&&(x[a][j]==false))
            {
              q.push(mp(a,j));
              // cout<<"jai\n";
              x[a][j]=true;
            }
          }
        }
        if(q.size()==0)
        break;
    }
    if(x[s2-1][e2-1])
    cout<<count;
    else
    cout<<"-1";
    return 0;
}

Measured memory_bytes: 5864