#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int H, W, sx, sy, dx, dy;
char grid[1011][1011];
int d1[4] = {-1,0,0,1}, d2[4] = {0,1,-1,0};

bool isSafe(int i, int j)
{
	return i >= 1 and i <= H and j >= 1 and j <= W and grid[i][j] != '#';
}

int main()
{
	ios::sync_with_stdio(0);cin.tie(0);
	cin >> H >> W;
	cin >> sx >> sy;
	cin >> dx >> dy;
	int dist[H+1][W+1];
	for(int i = 1;i <= H;i++)
		for(int j = 1;j <= W;j++)
			cin >> grid[i][j], dist[i][j] = INT_MAX;
	if(grid[sx][sy] == '#')
		cout << -1;
	else 
	{
		deque<pair<int,int>> dq;
		dq.push_back({sx,sy});
		dist[sx][sy] = 0;
		while(!dq.empty())
		{
			auto x = dq.front();dq.pop_front();
			int i = x.first, j = x.second;
			for(int it = 0;it < 4;it++)
			{
				if(isSafe(i + d1[it],j + d2[it]) and dist[i+d1[it]][j+d2[it]] > dist[i][j])
				{	
					dq.push_front({i + d1[it],j + d2[it]});
					dist[i + d1[it]][j + d2[it]] = dist[i][j];
				}
			}
			for(int it = -2;it <= 2;it++)
			{
				for(int jt = -2;jt <= 2;jt++)
				{
					if(isSafe(i+it,j+jt) and dist[i + it][j + jt] > dist[i][j] + 1)
					{
						dist[i+it][j+jt] = dist[i][j] + 1;
						dq.push_back({i + it, j + jt});
					}
				} 
			}
		}
		cout << ((dist[dx][dy] == INT_MAX) ? -1 : dist[dx][dy]) << '\n';
	}
}
