#include <bits/stdc++.h>
 
using namespace std;
 
#define send {ios_base::sync_with_stdio(false);}
#define help {cin.tie(NULL); cout.tie(NULL);}
#define f first
#define s second
#define getunique(v) {sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end());}
typedef long long ll;
typedef long double lld;
typedef unsigned long long ull;
 
template<typename A> ostream& operator<<(ostream &cout, vector<A> const &v);
template<typename A, typename B> ostream& operator<<(ostream &cout, pair<A, B> const &p) { return cout << "(" << p.f << ", " << p.s << ")"; }
template<typename A> ostream& operator<<(ostream &cout, vector<A> const &v) {
	cout << "["; for(int i = 0; i < v.size(); i++) {if (i) cout << ", "; cout << v[i];} return cout << "]";
}
template<typename A, typename B> istream& operator>>(istream& cin, pair<A, B> &p) {
	cin >> p.first;
	return cin >> p.second;
}
 
mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
// mt19937 rng(61378913);
/* usage - just do rng() */
 
void usaco(string filename) {
  // #pragma message("be careful, freopen may be wrong")
	freopen((filename + ".in").c_str(), "r", stdin);
	freopen((filename + ".out").c_str(), "w", stdout);
}
 
const lld pi = 3.14159265358979323846;
// const ll mod = 1000000007;
// const ll mod = 998244353;
// ll mod;
 


ll n, m, k, q, l, r, x, y, z;
const ll template_array_size = 1000625;
ll a[template_array_size];
ll b[template_array_size];
ll c[template_array_size];
string s, t;
ll ans = 0;

bool mat[1005][1005];
bool vis[1005][1005];

ll dr[4] = {0, 0, -1, 1};
ll dc[4] = {1, -1, 0, 0};

bool valid(ll r, ll c) {
	return r >= 0 && r < n && c >= 0 && c < m;
}

void solve(int tc = 0) {
	cin >> n >> m;
	
	ll a, b, c, d;
	cin >> a >> b >> c >> d;
	--a; --b; --c; --d;
	
	for (ll i = 0; i < n; i++) {
		cin >> s;
		for (ll j = 0; j < m; j++) {
			mat[i][j] = (s[j] == '.');
		}
	}
		
	deque<pair<pair<ll, ll>, ll>> q;
	
	q.push_front(make_pair(make_pair(a, b), 0));
	
	while (!q.empty()) {
		pair<pair<ll, ll>, ll> x = q.front();
		q.pop_front();
		
		pair<ll, ll> pos = x.f;
		
		if (vis[pos.f][pos.s]) continue;
		vis[pos.f][pos.s] = 1;
		
		// cout << x << endl;
		
		if (pos.f == c && pos.s == d) {
			cout << x.s << '\n';
			return;
		}
		
		for (ll d = 0; d < 4; d++) {
			ll nr = pos.f + dr[d];
			ll nc = pos.s + dc[d];
			
			if (valid(nr, nc) && mat[nr][nc] && !vis[nr][nc]) {
				q.push_front(make_pair(make_pair(nr, nc), x.s));
			}
		}
		
		for (ll dr = -2; dr <= 2; dr++) {
			for (ll dc = -2; dc <= 2; dc++) {
				ll nr = pos.f + dr;
				ll nc = pos.s + dc;
				
				if (valid(nr, nc) && mat[nr][nc] && !vis[nr][nc]) {
					q.push_back(make_pair(make_pair(nr, nc), x.s + 1));
				}
			}
		}
	}
	
	cout << -1 << '\n';
}
 
int main() {
	#ifdef galen_colin_local
		auto begin = std::chrono::high_resolution_clock::now();
	#endif
	
	send help
 
	#ifndef galen_colin_local
		// usaco("cowland");
	#endif
	
	// usaco("cowland");
 
	int tc = 1;
	// cin >> tc;
	for (int t = 0; t < tc; t++) solve(t);
	
	#ifdef galen_colin_local
		auto end = std::chrono::high_resolution_clock::now();
		cout << setprecision(4) << fixed;
		// cout << "Execution time: " << std::chrono::duration_cast<std::chrono::duration<double>>(end - begin).count() << " seconds" << endl;
	#endif
} 

Measured memory_bytes: 7068