#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
#define quick ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const int inf = 0x3f3f3f3f, maxn = 2e5 + 5, mod = 998252334;
inline int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
struct node{
int x,y,step;
};
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int n,m;
void solve() {
n=read();m=read();
vector<vector<int>>grid(n+1,vector<int>(m+1));
int xs,ys,xt,yt;
xs=read(),ys=read(),xt=read(),yt=read();
char t;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>t;
if(t=='*'){
grid[i][j]=1;
if(i==xt&&j==yt){
cout<<-1<<endl;
return;
}
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<grid[i][j]<<' ';
// }
// cout<<endl;
// }
queue<node>que;
que.push({xs,ys,0});
while(!que.empty()){
node k=que.front();
que.pop();
for(int i=0;i<4;i++){
node nd;
nd.x=k.x+dx[i];
nd.y=k.y+dy[i];
if(nd.x==xt&&nd.y==yt){
cout<<k.step+1<<endl;
return;
}
if(nd.x<1||nd.y<1||nd.x>n||nd.y>m) continue;
if(grid[nd.x][nd.y]==1) continue;
grid[nd.x][nd.y]=1;
nd.step=k.step+1;
que.push(nd);
}
}
cout<<-1<<endl;
}
signed main() {
int t = 1;
// cin>>t;
while (t--) {
solve();
}
return 0;
}