/* 
  ╔╗         ╔╗              ╔═══╗                                  
  ║║        ╔╝╚╗             ║╔═╗║                                  
  ║║╔╗╔╗╔══╗╚╗╔╝    ╔══╗     ║╚═╝║╔═╗╔══╗╔══╗╔═╗╔══╗ ╔╗╔╗╔╗╔╗╔══╗╔═╗
╔╗║║║║║║║══╣ ║║     ╚ ╗║     ║╔══╝║╔╝║╔╗║║╔╗║║╔╝╚ ╗║ ║╚╝║║╚╝║║╔╗║║╔╝
║╚╝║║╚╝║╠══║ ║╚╗    ║╚╝╚╗    ║║   ║║ ║╚╝║║╚╝║║║ ║╚╝╚╗║║║║║║║║║║═╣║║ 
╚══╝╚══╝╚══╝ ╚═╝    ╚═══╝    ╚╝   ╚╝ ╚══╝╚═╗║╚╝ ╚═══╝╚╩╩╝╚╩╩╝╚══╝╚╝ 
                                         ╔═╝║                       
                                         ╚══╝                       */


//Header files
#include <bits/stdc++.h>
using namespace std;
using namespace std::chrono;

/*-----------------------------------------------Debug Template Start-----------------------------------------------*/
void __print(int x) {cerr << x;}
void __print(long x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(unsigned x) {cerr << x;}
void __print(unsigned long x) {cerr << x;}
void __print(unsigned long long x) {cerr << x;}
void __print(float x) {cerr << x;}
void __print(double x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << '\'' << x << '\'';}
void __print(const char *x) {cerr << '\"' << x << '\"';}
void __print(const string &x) {cerr << '\"' << x << '\"';}
void __print(bool x) {cerr << (x ? "true" : "false");}

template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifndef ONLINE_JUDGE
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif

/*-----------------------------------------------Debug Template End-----------------------------------------------*/

//Short data-types declaration
typedef long long ll;
typedef vector<int> vi;
typedef vector<long long> vl;
typedef vector<string> vs;
typedef vector<vector<int> > vii;  
typedef vector<vector<long long> >vll;
typedef vector<bool> vb;
typedef vector<vector<bool>> vbb;

//Macros
#define MK make_pair
#define EB emplace_back
#define PB push_back
#define F first
#define S second
#define rep(i,start,end) for(int i=(int)start;i<(int)end;i++)
#define repr(i,start,end) for(int i=(int)start;i>(int)end;i--)
#define all(x) (x).begin(), (x).end()

//Constants
const int mod = 1e9+7;

//Some useful functions
ll binpow(ll num,ll pow);
inline int mul(int a,int b) {return (a*1ll*b)%mod;}
inline int add(int a,int b) {return (a+0ll+b)%mod;}
inline int sub(int a,int b) {return ((a+0ll-b)%mod+mod)%mod; }
/*------------------------------------------------------Code Starts------------------------------------------------------*/
inline void solve()
{
	int h,w;
	cin>>h>>w;
	int sx,sy,gx,gy;
	cin>>sy>>sx>>gy>>gx;
	sy--,sx--,gy--,gx--;
	pair<int,int> s={sx,sy},g={gx,gy};
	vs sur(h);
	rep(i,0,h) cin>>sur[i];
	auto inout=[&](int x,int y)
	{
		if(0<=x && x<w && 0<=y && y<h) return true;
		else return false;
	};
	queue<pair<int,int>> p,q;
	int dx[4]={0,0,1,-1}, dy[4]={1,-1,0,0};
	p.push(s);
	int can=0;
	while(!p.empty())
	{
		while(!p.empty())
		{
			pair<int,int> now= p.front();
			p.pop();
			q.push(now);
			rep(i,0,4)
			{
				pair<int,int> nxt={now.F+dx[i],now.S+dy[i]};
				if(inout(nxt.F,nxt.S))
				{
					if(sur[nxt.S][nxt.F]=='.')
					{
						if(nxt==g)
						{
							cout<<can<<'\n';
							return;
						}
						p.push(nxt);
						sur[nxt.S][nxt.F]='#';
					}
				}
			}
		}
		can++;
		while(!q.empty())
		{
			auto now=q.front();
			q.pop();
			for(int i=-2;i<3;i++)
			{
				for(int j=-2;j<3;j++)
				{
					pair<int,int> nxt={now.F+i,now.S+j};
					if(inout(nxt.F,nxt.S))
					{
						if(sur[nxt.S][nxt.F]=='.')
						{
							p.push(nxt);
							sur[nxt.S][nxt.F]='#';
							if(nxt==g)
							{
								cout<<can<<'\n';
								return;
							}
						}
					}
				}
			}
		}
	}
	cout<<-1<<'\n';
}

int main()
{
	auto start = high_resolution_clock::now();
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int t=1;
	//cin>>t;
	while(t--)
	{
		solve();
	}
	auto stop = high_resolution_clock::now(); 
	auto duration = duration_cast<microseconds>(stop - start); 
	cerr<<duration.count()<<" microseconds\n";
	return 0;
}
/*------------------------------------------------------Code ends------------------------------------------------------*/
ll binpow(ll num,ll pow)
{
	if(pow==0)
		return 1;
	ll val=binpow(num,pow/2);
	val*=val;
	if(pow&1) val*=num;
	return val;
}



Measured memory_bytes: 4776