#include <bits/stdc++.h>
using namespace std;
struct csp{
int x,y,step;
};
int n,m;
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
int main(){
ios::sync_with_stdio(0);
cin.tie(),cout.tie();
cin>>n>>m;
char a[n+100][m+100];
bool res[n+100][m+100],vis[n+100][m+100];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
while(1){
int sx,sy,ex,ey;
cin>>ex>>ey>>sx>>sy;
if(sx==0&&sy==0&&ex==0&&ey==0) return 0;
//清空
memset(res,0,sizeof(res));
memset(vis,0,sizeof(vis));
//可以看拿到奖杯的地方
for(int i=ex;i<=n;i++){
if(a[i][ey]=='X') break;
res[i][ey]=1;
}
for(int i=ex;i>=1;i--){
if(a[i][ey]=='X') break;
res[i][ey]=1;
}
for(int i=ey;i<=m;i++){
if(a[ex][i]=='X') break;
res[ex][i]=1;
}
for(int i=ey;i>=1;i--){
if(a[ex][i]=='X') break;
res[ex][i]=1;
}
for(int i=0;ex+i<=n,ey+i<=m;i++){
int tx=i+ex,ty=i+ey;
if(a[tx][ty]=='X') break;
res[tx][ty]=1;
}
for(int i=0;ex+i<=n,ey-i>=1;i++){
int tx=i+ex,ty=ey-i;
if(a[tx][ty]=='X') break;
res[tx][ty]=1;
}
for(int i=0;ex-i>=1,ey+i<=m;i++){
int tx=ex-i,ty=i+ey;
if(a[tx][ty]=='X') break;
res[tx][ty]=1;
}
for(int i=0;ex-i>=1,ey-i>=1;i++){
int tx=ex-i,ty=ey-i;
if(a[tx][ty]=='X') break;
res[tx][ty]=1;
}
//广搜
bool flag=0;
queue<csp> q;
q.push((csp){sx,sy,0});
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
int step=q.front().step;
q.pop();
if(res[x][y]){
cout<<step<<endl;
flag=1;
break;
}
if(vis[x][y]) continue;
vis[x][y]=1;
for(int i=1;i<=4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!='X') q.push((csp){tx,ty,step+1});
}
}
if(!flag) cout<<"Poor Harry\n";
}
return 0;
}