#include<iostream>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<vector>
#include<math.h>
long long int mod = 1000000007;
long long modpow(long long a, long long n, long long mod);
long long modinv(long long a, long long mod);
long long int a[200000];
char s[1000][1000];
int wc[1000][1000];
using namespace std;
int co[300000];
int ro[300000];
int main() {
	
	//E
	/*int h, w, m;
	cin >> h >> w >> m;

	int m;
	int i, c, r;
	for (i = 0; i < m; i++) {
		cin >> c >> r;
		co[ ]
	}
	*/


	//D
	int h, w;
	int ch, cw, dh, dw;
	cin >> h >> w;
	cin >> ch >> cw;
	cin >> dh >> dw;
	ch--; cw--; dh--; dw--;
	int i, j;
	for (i = 0; i < h; i++) {
		for (j = 0; j < w; j++) {
			cin >> s[i][j];
			wc[i][j] = 100000000;
		}
	}

	queue<pair<int, int>> que, que2;
	pair<int, int> p,pp;
	//int wp = 0;
	p.first = ch; p.second = cw;
	wc[ch][cw] = 0;
	que.push(p);
	//que2.push(p);
	while (1) {
		while (que.size()) {

			p = que.front(); que.pop();
			que2.push(p);
			if (p.first > 0) {
				if (wc[p.first - 1][p.second] > wc[p.first][p.second]) {
					if (s[p.first - 1][p.second] == '.') {
						wc[p.first - 1][p.second] = wc[p.first][p.second];
						pp.first = p.first - 1; pp.second = p.second;
						que.push(pp);
						//que2.push(pp);
						//cout << pp.first << ' ' << pp.second << endl;
					}
				}
			}

			if (p.first < h - 1) {
				if (wc[p.first + 1][p.second] > wc[p.first][p.second]) {
					if (s[p.first + 1][p.second] == '.') {
						wc[p.first + 1][p.second] = wc[p.first][p.second];
						pp.first = p.first + 1; pp.second = p.second;
						que.push(pp);
						//que2.push(pp);
						//cout << pp.first << ' ' << pp.second << endl;
					}
				}
			}

			if (p.second > 0) {
				if (wc[p.first][p.second - 1] > wc[p.first][p.second]) {
					if (s[p.first][p.second - 1] == '.') {
						wc[p.first][p.second - 1] = wc[p.first][p.second];
						pp.first = p.first; pp.second = p.second - 1;
						que.push(pp);
						//que2.push(pp);
						//cout << pp.first << ' ' << pp.second << endl;
					}
				}
			}

			if (p.second < w - 1) {
				if (wc[p.first][p.second + 1] > wc[p.first][p.second]) {
					if (s[p.first][p.second + 1] == '.') {
						wc[p.first][p.second + 1] = wc[p.first][p.second];
						pp.first = p.first; pp.second = p.second + 1;
						que.push(pp);
						//que2.push(pp);
						;					//cout << pp.first << ' ' << pp.second << endl;
					}
				}
			}

		}
		while (que2.size()) {
			p = que2.front(); que2.pop();
			for (i = -2; i <= 2; i++) {
				for (j = -2; j <= 2; j++) {

					if ((p.first + i < h) && (p.first + i >= 0) && (p.second + j < w) && (p.second + j >= 0)) {
						if (wc[p.first + i][p.second + j] > wc[p.first][p.second] + 1) {
							if (s[p.first + i][p.second + j] == '.') {
								wc[p.first + i][p.second + j] = wc[p.first][p.second] + 1;
								pp.first = p.first + i; pp.second = p.second + j;
								que.push(pp);
							}
						}
					}

				}
			}
		}
		if (que.size() == 0)break;
	}
	//for (i = 0; i < h; i++) {
	//	for (j = 0; j < w; j++) {
	//		if (wc[i][j] == 100000000) {
	//			cout << '#';
	//		}
	//		else {
	//			cout << wc[i][j];
	//		}
	//	}
	//	cout << endl;
	//}
	if (wc[dh][dw] == 100000000) {
		cout << -1 << endl;
	}
	else {
		cout << wc[dh][dw] << endl;
	}
	return 0;
	


	//C
	/*int n;

	cin >> n;
	int i;
	for (i = 0; i < n; i++) {
		cin >> a[i];
	}
	long long int s = 0;
	long long int m = a[0];
	for (i = 1; i < n; i++) {
		if (a[i] > m) {
			m = a[i];
		}
		else {
			s = s + m - a[i];
		}
	}
	cout << s << endl;
	return 0;
	*/

	//B
	/*string s;
	cin >> s;
	int n = 0;
	int i;
	for (i = 0; i < s.length(); i++) {
		n = n + (s[i] - '0');
		n = n % 9;
	}
	if (n == 0) {
		cout << "Yes" << endl;
	}
	else {
		cout << "No" << endl;

	}
	return 0;*/

	//A
	/*int n, x, t;
	cin >> n >> x >> t;
	cout << ((n - 1) / x) * t + t << endl;

	return 0;
	*/
}
// a^n mod を計算する
long long modpow(long long a, long long n, long long mod) {
	long long res = 1;
	while (n > 0) {
		if (n & 1) res = res * a % mod;
		a = a * a % mod;
		n >>= 1;
	}
	return res;
}

// a^{-1} mod を計算する
long long modinv(long long a, long long mod) {
	return modpow(a, mod - 2, mod);
}

Measured memory_bytes: 8420