#include<bits/stdc++.h>
#define y1 yone
using namespace std;
int n, m, x1, y1, x2, y2;
vector<string> v(1);
bitset<17000> vis[17000];
deque<tuple<int, int, int>> dq;
const tuple<int, int, int> dir[]{{1, 0, 1}, {0, 1, 1}, {-1, 0, 1}, {0, -1, 1}};
tuple<int, int, int> operator+=(tuple<int, int, int> &t1, tuple<int, int, int> t2){
get<0>(t1) += get<0>(t2), get<1>(t1) += get<1>(t2), get<2>(t1) += get<2>(t2);
return t1;
}bool check(int x, int y){
return x >= 1 and x <= n and y >= 1 and y <= m and v[x][y] == 'O' and !vis[x][y];
}bool see(int x, int y){
if(x == x2){
for(int i = min(y, y2); i <= max(y, y2); ++i){
if(v[x][i] != 'O')
return 0;
}return 1;
}else if(y == y2){
for(int i = min(x, x2); i <= max(x, x2); ++i){
if(v[i][y] != 'O')
return 0;
}return 1;
}else if(x - x2 == y - y2){
for(int i = 0; i <= abs(x - x2); ++i){
int x3 = min(x, x2) + i, y3 = min(y, y2) + i;
if(v[x3][y3] != 'O')
return 0;
}return 1;
}else if(x - x2 == y2 - y){
for(int i = 0; i <= abs(x - x2); ++i){
int x3 = min(x, x2) + i, y3 = max(y, y2) - i;
if(v[x3][y3] != 'O')
return 0;
}return 1;
}return 0;
}int bfs(int x, int y){
if(see(x, y))
return 0;
for(bitset<17000> &bs: vis)
bs.reset();
dq.assign(1, tuple<int, int, int>(x, y, 0));
while(dq.size()){
tuple<int, int, int> t = dq[0];
dq.pop_front();
for(tuple<int, int, int> t1: dir){
t1 += t;
int x = get<0>(t1), y = get<1>(t1), s = get<2>(t1);
if(!check(x, y))
continue;
if(see(x, y))
return s;
dq.push_back(t1);
vis[x].set(y);
}
}return -1;
}signed main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++i){
string s;
cin >> s;
v.push_back(string(1, ' ') + s);
}while(scanf("%d%d%d%d", &x1, &y1, &x2, &y2) != -1 and x1){
int k = bfs(x1, y1);
if(k != -1)
printf("%d\n", k);
else
printf("Poor Harry\n");
}return 0;
}