/*
要注意使用优先队列,成功的路有长有短。
*/
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int n,m,sx,sy;
char mp[222][222];
bool vis[222][222];
const int dp[4][2]={ {1,0},{-1,0},{0,1},{0,-1} };
struct Point {
int x,y,step;
bool operator <(const Point &p)const {
return p.step<step;
}
};
void DataIn() {
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
cin>>mp[i][j];
if (mp[i][j]=='r') sx=i, sy=j;
}
}
}
void Bfs() {
memset(vis,false,sizeof(vis));
Point now,next;
priority_queue<Point> pq;
now.x=sx;
now.y=sy;
now.step=0;
pq.push(now);
vis[now.x][now.y]=true;
while (!pq.empty()) {
now=pq.top();
pq.pop();
if (mp[now.x][now.y]=='a') {
printf("%d\n", now.step);
return ;
}
for (int i=0; i<4; i++) {
next=now;
next.x+=dp[i][0];
next.y+=dp[i][1];
if (next.x<0 || next.x>=n || next.y<0 || next.y>=m || vis[next.x][next.y] || mp[next.x][next.y]=='#') continue;
if (mp[next.x][next.y]=='x') next.step=now.step+2;
else next.step=now.step+1;
vis[next.x][next.y]=true;
pq.push(next);
}
}
printf("Poor ANGEL has to stay in the prison all his life.\n");
return ;
}
int main() {
while (~scanf("%d%d", &n,&m)) {
DataIn();
Bfs();
}
return 0;
}