#include<cstdio>
#include<string>
#include<queue>
using namespace std;
int n, m;
char acw[100][100];
bool inq[100][100] = { false };
int X[4] = { 0, 0, 1, -1 };
int Y[4] = { 1, -1, 0, 0 };
struct node{
int x, y, step;
}Node,S,T;
bool jud(int x, int y)
{
if (x < 0 || x >= n || y < 0 || y >= m) return false;
if (acw[x][y] == '*'||inq[x][y] == true) return false;
else return true;
}
int bfs(node S){
queue<node> Q;
Q.push(S);
while (!Q.empty()){
node top = Q.front();
Q.pop();
if (top.x==T.x&&top.y==T.y){
return top.step;
}
for (int i = 0; i < 4; i++)
{
int newX = top.x + X[i];
int newY = top.y + Y[i];
if (jud(newX, newY)==true){
Node.x = newX, Node.y = newY;
Node.step = top.step + 1;
Q.push(Node);
inq[newX][newY] = true;
}
}
}
return -1;
}
int main(){
int i,j;
scanf("%d%d", &n, &m);
for (i = 0; i < n; i++)
{
getchar();//吸收上一行的换行符
for (j = 0; j < m; j++)
{
scanf("%c", &acw[i][j]);
}
}
scanf("%d%d%d%d", &S.x, &S.y, &T.x, &T.y);
S.step = 0;
printf("%d\n",bfs(S));
return 0;
}
/*测试数据*/
/*
sample input
5 5
.....
.*.*.
.*S*.
.***.
...T*
2 2 4 3
sample output
11
*/