#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,dis[1005][1005],tx,ty,fx,fy;
char a[1005][1005];
bool vis[1005][1005],flag[1005][1005];
const int f[][2]={{1,0},{0,1},{-1,0},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};
struct node
{
int x,y;
};
void bfs(int x,int y)
{
memset(vis,false,sizeof(vis));
memset(dis,-1,sizeof(dis));
memset(flag,false,sizeof(flag));
for(int i=0;i<8;i++)
{
int nx=fx,ny=fy;
while(1<=nx&&nx<=n&&1<=ny&&ny<=m&&a[nx][ny]=='O')
{
flag[nx][ny]=true;
nx+=f[i][0];
ny+=f[i][1];
}
}
queue<node>q;
q.push({x,y});
vis[x][y]=true;
dis[x][y]=0;
while(!q.empty())
{
node now=q.front();
q.pop();
if(flag[now.x][now.y])
{
cout<<dis[now.x][now.y]<<endl;
return;
}
for(int i=0;i<4;i++)
{
int nx=now.x+f[i][0],ny=now.y+f[i][1];
if(nx<1||nx>n||ny<1||ny>m)continue;
if(a[nx][ny]=='X')continue;
if(vis[nx][ny])continue;
vis[nx][ny]=true;
dis[nx][ny]=dis[now.x][now.y]+1;
q.push({nx,ny});
}
}
puts("Poor Harry");
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
while(true)
{
cin>>fx>>fy>>tx>>ty;
if(tx==0&&ty==0&&fx==0&&fy==0)break;
bfs(tx,ty);
}
return 0;
}