#include<bits/stdc++.h>
#define int long long
using namespace std;
char s[20100];
int n,m,nx,ny,finish_x,finish_y;
int v[20100];
int dx[5] = {0,0,1,0,-1};
int dy[5] = {0,1,0,-1,0};
int dx_[5] = {0,1,-1,-1,1};
int dy_[5] = {0,1,-1,1,-1};
struct node
{
int x,y,data;
};
queue<node> que;
void init()
{
for (int i = 1;i <= 4;i++)
{
int xx = finish_x,yy = finish_y;
while(1)
{
xx = xx + dx[i];
yy = yy + dy[i];
if (s[(xx - 1) * m + yy] != 'X' && xx >= 1 && xx <= n && yy >= 1 && yy <= m)
{
v[(xx - 1) * m + yy] = 2;
}
else
{
break;
}
}
}
for (int i = 1;i <= 4;i++)
{
int xx = finish_x,yy = finish_y;
while(1)
{
xx = xx + dx_[i];
yy = yy + dy_[i];
if (s[(xx - 1) * m + yy] != 'X' && xx >= 1 && xx <= n && yy >= 1 && yy <= m)
{
v[(xx - 1) * m + yy] = 2;
}
else
{
break;
}
}
}
}
void bfs()
{
while(!que.empty())
{
int x = que.front().x;
int y = que.front().y;
int cnt = que.front().data;
que.pop();
for (int i = 1;i <= 4;i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if (s[(xx - 1) * m + yy] != 'X' && v[(xx - 1) * m + yy] != 1 && xx >= 1 && xx <= n && yy >= 1 && yy <= m)
{
if (v[(xx - 1) * m + yy] == 2)
{
cout << cnt + 1 << endl;
return;
}
v[(xx - 1) * m + yy] = 1;
que.push(node{xx,yy,cnt + 1});
}
}
}
cout << "Poor Harry" << endl;
}
signed main()
{
cin >> n >> m;
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= m;j++)
{
cin >> s[(i - 1) * m + j];
}
}
while(1)
{
cin >> finish_x >> finish_y >> nx >> ny;
if (finish_x == 0 && finish_y == 0 && nx == 0 && ny == 0)
{
break;
}
while(!que.empty())
{
que.pop();
}
memset(v,0,sizeof(v));
if (nx == finish_x && ny == finish_y)
{
cout << 0 << endl;
continue;
}
v[(finish_x - 1) * m + finish_y] = 2;
init();
if (v[(nx - 1) * m + ny] == 2)
{
cout << 0 << endl;
continue;
}
v[(nx - 1) * m + ny] = 1;
que.push(node{nx,ny,0});
bfs();
}
return 0;
}