/*
BFS:二进制状态压缩
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 11111
#include<queue>
const int INF = 999999;
struct node
{
int x,y,step;
int key;
};
queue<node> q;
int n,m,time;
char mp[105][105];
bool vis[105][105][20];
int xx[4]={1,-1,0,0};
int yy[4]={0,0,1,-1};
int bfs(int x,int y)
{
node from,next;
from.x=x,from.y=y,from.key=0,from.step=0;
vis[x][y][0]=1;
q.push (from);
while(!q.empty ())
{
from=q.front ();
q.pop ();
for(int i=0;i<4;i++)
{
int dx=from.x+xx[i];
int dy=from.y+yy[i];
if(dx>=0&&dx<n&&dy>=0&&dy<m&&vis[dx][dy][from.key]==0&&mp[dx][dy]!='#')
{
next.x=dx,next.y=dy,next.step=from.step+1;
if(mp[dx][dy]=='X')
return from.step+1;
else if(mp[dx][dy]>='a'&&mp[dx][dy]<='d')//find the key
{
next.key=from.key|(1<<(mp[dx][dy]-'a'));
vis[dx][dy][from.key]=1;
q.push (next);
}
else if(mp[dx][dy]>='A'&&mp[dx][dy]<='D')//find the door
{
if(from.key&(1<<(mp[dx][dy]-'A')))
{
next.key=from.key;
vis[dx][dy][from.key]=1;
q.push (next);
}
}
else
{
vis[dx][dy][from.key]=1;
next.key=from.key;
q.push (next);
}
}
}
}
return -1;
}
int main()
{
int i,j;
int x,y;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
while(!q.empty ())
q.pop ();
for(i=0;i<n;i++)
{
scanf("%s",mp[i]);
for(j=0;j<m;j++)
{
if(mp[i][j]=='*')
x=i,y=j;
if(mp[i][j]=='B')
mp[i][j]='A';
if(mp[i][j]=='Y')
mp[i][j]='B';
if(mp[i][j]=='R')
mp[i][j]='C';
if(mp[i][j]=='G')
mp[i][j]='D';
if(mp[i][j]=='b')
mp[i][j]='a';
if(mp[i][j]=='y')
mp[i][j]='b';
if(mp[i][j]=='r')
mp[i][j]='c';
if(mp[i][j]=='g')
mp[i][j]='d';
}
}
int ans=bfs(x,y);
if(ans==-1)
printf("The poor student is trapped!\n");
else
printf("Escape possible in %d steps.\n",ans);
}
return 0;
}