#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int N = 20000;
int n, m;
int sx, sy, ex, ey;
char w[N];
bool look[N];
int dist[N];
int dx[] = {-1, 0, 1, 0, -1, -1, 1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, 1, -1};
struct Ver
{
int x, y;
};
bool check(int x, int y)
{
int u = (x - 1) * m + y;
return u >= 1 && u <= n * m && w[u] == 'O';
}
void initLook()
{
memset(look, false, sizeof look);
look[(ex - 1) * m + ey] = true;
for (int i = 0; i < 8; i ++)
{
int x = ex + dx[i];
int y = ey + dy[i];
while (check(x, y))
{
look[(x - 1) * m + y] = true;
x += dx[i], y += dy[i];
}
}
}
void bfs()
{
memset(dist, -1, sizeof dist);
dist[(sx - 1) * m + sy] = 0;
queue<Ver> q;
q.push({sx, sy});
while (q.size())
{
auto t = q.front();
q.pop();
if (look[(t.x - 1) * m + t.y])
{
printf("%d\n", dist[(t.x - 1) * m + t.y]);
return;
}
for (int i = 0; i < 4; i ++)
{
int x = t.x + dx[i];
int y = t.y + dy[i];
if (check(x, y) && dist[(x - 1) * m + y] == -1)
{
dist[(x - 1) * m + y] = dist[(t.x - 1) * m + t.y] + 1;
q.push({x, y});
}
}
}
printf("Poor Harry\n");
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++)
for (int j = 1; j <= m; j ++)
scanf(" %c", &w[(i - 1) * m + j]);
while (~scanf("%d%d%d%d", &ex, &ey, &sx, &sy), sx || sy || ex || ey)
{
initLook();
bfs();
}
return 0;
}