#include<bits/stdc++.h>
using namespace std;
int move[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int z,h;
struct step{
int n,m,dis;
};
int main()
{
cin>>z>>h;
char d[z+5][h+5];
int vis[z+5][h+5];
int sight[z+5][h+5];
for(int i=1;i<=z;++i)
for(int j=1;j<=h;++j)
cin>>d[i][j];
int a,b,sa,sb;
while(cin>>sa>>sb>>a>>b)
{
if(a==0&&b==0&&sa==0&&sb==0)return 0;
int flag=1,flag2=0;
memset(vis,0,sizeof(vis));
memset(sight,0,sizeof(sight));
for(int i=sa;i>=1;--i){if(d[i][sb]=='X')break;else sight[i][sb]==1;}
for(int i=sb;i<=h;++i){if(d[sa][i]=='X')break;else sight[sa][i]==1;}
for(int i=sa;i<=z;++i){if(d[i][sb]=='X')break;else sight[i][sb]==1;}
for(int i=sb;i>=1;--i){if(d[sa][i]=='X')break;else sight[sa][i]==1;}
int x=1,y=-1;
int aa=sa,bb=sb;
while(1){
int xx=aa+x,yy=bb+y;
if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
sight[xx][yy]=1;
aa=xx,bb=yy;
}
x=1,y=1;
aa=sa,bb=sb;
while(1){
int xx=aa+x,yy=bb+y;
if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
else sight[xx][yy]=1;
aa=xx,bb=yy;
}
x=-1,y=-1;
aa=sa,bb=sb;
while(1){
int xx=aa+x,yy=bb+y;
if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
else sight[xx][yy]=1;
aa=xx,bb=yy;
}
x=-1,y=1;
aa=sa,bb=sb;
while(1){
int xx=aa+x,yy=bb+y;
if(xx>z||xx<1||yy>h||yy<1||d[xx][yy]=='X')break;
else sight[xx][yy]=1;
aa=xx,bb=yy;
}
if(sight[a][b]==1){
cout<<0<<endl;
continue;
}
step c; c.n=a,c.m=b,c.dis=0;
queue<step> q;
q.push(c);vis[a][b]=1;
while(!q.empty())
{
step k=q.front();q.pop();
for(int i=0;i<4;++i)
{ step next;
next.n=k.n+move[i][0];
next.m=k.m+move[i][1];
next.dis=k.dis+1;
if(next.n>z||next.m>h||next.n<1||next.m<1||vis[next.n][next.m]==1||d[next.n][next.m]=='X')continue;
if(sight[next.n][next.m]==1){cout<<next.dis<<endl;flag=0;break;}
vis[next.n][next.m]=1;
q.push(next);
}
if(flag==0)break;
}
if(flag==1)cout<<"Poor Harry"<<endl;
}
return 0;
}