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

template<typename T>
istream &operator>>(istream &is, vector<T> &v) {
	for (auto &x : v) is >> x;
	return is;
}

int n, m;
vector<int> c(2), f(2);
vector<vector<char>> a;

int bfs() {
	deque<pair<int, pair<int, int>>> d;
	vector<vector<int>> vis(n, vector<int>(m));
	d.push_front({c[0], {c[1], 0}});
	while (d.size()) {
		int x = d.front().first;
		int y = d.front().second.first;
		int z = d.front().second.second;
		d.pop_front();
		//cerr << "x: " << x << " y: " << y << '\n';
		if (x < 0 || y < 0 || x >= n || y >= m || vis[x][y] || a[x][y] == '#') continue;
		if (x == f[0] && y == f[1]) {
			return z;
		}
		//cerr << "x: " << x << " y: " << y << '\n';
		vis[x][y] = 1;
		d.push_front({x - 1, {y, z}});
		d.push_front({x + 1, {y, z}});
		d.push_front({x, {y - 1, z}});
		d.push_front({x, {y + 1, z}});
		for (int i = x - 2; i <= x + 2; i++) {
			for (int j = y - 2; j <= y + 2; j++) {
				d.push_back({i, {j, z + 1}});
			}
		}
	}
	return -1;
}

int main() {
	ios::sync_with_stdio(0); cout.tie(0); cin.tie(0);
	cin >> n >> m >> c >> f;
	c[0]--, c[1]--, f[0]--, f[1]--;
	a = vector<vector<char>>(n, vector<char>(m)); cin >> a;
	cout << bfs() << '\n';
	return 0;
}
