#include<bits/stdc++.h>
#include<queue>
#define N 16390
#define IOS ios::sync_with_stdio(false)
#define CT cin.tie(NULL)
#define Ct cout.tie(NULL)
#define l_queue priority_queue <int,vector<int>,greater<int> >
#define p_queue priority_queue <int>
inline void read(int& a){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();}a=s*w;}
void write(int x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');}
using namespace std;
struct node{
int x,y,step;
};
queue<node> q;
int n,m,z,qx,qy,zx,zy;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int dx_[8]={0,0,1,1,1,-1,-1,-1},dy_[8]={1,-1,-1,0,1,-1,0,1};
bool v[N][N],vis[N][N];
string s[N];
bool zz(int a,int b,int c,int d){
if(a==b==c==d==0) return 1;
return 0;
}
bool pd(int a,int b){
if(a<1||a>n||b<1||b>m||s[a][b]=='X') return 0;
return 1;
}
void bfs(int x,int y,int step){
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(pd(xx,yy)&&!vis[N][N]){
q.push({xx,yy,step+1});
if(v[xx][yy]){
write(step);
puts("");
return ;
}
}
}
q.pop();
if(q.size()) bfs(q.front().x,q.front().y,q.front().step);
}
signed main(){
IOS;CT;Ct;
read(n);read(m);
for(int i=1;i<=n;i++) cin>>s[i];
while(cin>>qx>>qy>>zx>>zy){
if(zz(qx,qy,zx,zy)) return 0;
for(int i=0;i<8;i++){
int _=zx,__=zy;
while(pd(_,__)){
_+=dx_[i],__+=dy_[i];
v[_][__]=1;
}
}
memset(vis,INT_MAX,sizeof vis);
vis[qx][qy]=0;
bfs(qx,qy,0);
puts("Poor Harry");
}
return 0;
}