#include <bits/stdc++.h>
using namespace std;
struct Node{
int x,y,time;
};
vector<vector<char>>a;
vector<vector<char>>b;
int start_x,start_y,end_x,end_y;
int n,m;
bool judge(int x,int y){
if(x>=1 && x<=n && y>=1 && y<=m && b[x][y]!='X'){
return true;
}
return false;
}
void first_op(){
b=a;
int dx[]={0,0,1,1,1,-1,-1,-1};
int dy[]={1,-1,-1,0,1,-1,0,1};
for(int i=0;i<8;i++){
int tx=end_x,ty=end_y;
while(judge(tx,ty)){
b[tx][ty]='W';
tx+=dx[i];
ty+=dy[i];
}
}
}
void bfs(){
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
map<pair<int,int>,bool>vis;
queue<Node>que;
que.push(Node{start_x,start_y,0});
vis[make_pair(start_x,start_y)]= true;
if(b[start_x][start_y]=='W'){
printf("%d\n",0);
return;
}
while(que.size()){
Node head = que.front();
for(int i=0;i<4;i++){
int tx = head.x+dx[i];
int ty = head.y+dy[i];
if(judge(tx,ty) && !vis[make_pair(tx,ty)]){
if(b[tx][ty]=='W'){
printf("%d\n",head.time+1);
return;
}
que.push(Node{tx,ty,head.time+1});
vis[make_pair(tx,ty)]= true;
}
}
que.pop();
}
printf("Poor Harry\n");
return;
}
int main() {
scanf("%d%d",&n,&m);
a = vector<vector<char>>(n+10,vector<char>(m+10));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%c",&a[i][j]);
if(a[i][j]=='\n')j--;
}
}
while(true){
scanf("%d%d%d%d",&end_x,&end_y,&start_x,&start_y);
if(!end_x && !end_y && !start_x && !start_y)break;
first_op();
bfs();
}
return 0;
}