//求迷宫最短路问题;
//在上面加了一些东西;
//最短路 的话我们首先想到的一般都是BFS
//那么问题主要记录路径的问题
#include<iostream>
#include<string.h>
#include<queue>
using namespace std;
const int MAX=999999;
struct dian
{
int x;
int y;
int quan;
bool operator < (const dian &a) const
{
return quan>a.quan ;//最小值优先
}
};
int n,m;
int lu[101][101];
int visit[101][101];
char maze[101][101];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs()
{
int i,j;
priority_queue<dian>p;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
lu[i][j]=MAX;
}
}
lu[0][0]=0;
dian arry;
arry.x=0;
arry.y=0;
arry.quan=0;
p.push(arry);
while(p.size())
{
dian j1=p.top();
p.pop();
for(i=0;i<4;i++)
{
int nx=j1.x+dx[i];
int ny=j1.y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&maze[nx][ny]!='X'&&lu[nx][ny]==MAX)
{
dian wu;
wu.x=nx;
wu.y=ny;
visit[nx][ny]=i+1;
if(maze[nx][ny]=='.')
{
if(lu[nx][ny]>lu[j1.x][j1.y]+1)
{
lu[nx][ny]=lu[j1.x][j1.y]+1;
wu.quan=lu[nx][ny];
p.push(wu);
}
}
else
{
if(lu[nx][ny]>(lu[j1.x][j1.y]+maze[nx][ny]-'0'+1))
{
lu[nx][ny]=lu[j1.x][j1.y]+maze[nx][ny]-'0'+1;
wu.quan=lu[nx][ny];
p.push(wu);
}
}
}
}
}
return lu[n-1][m-1];
}
int temp;
void lujing(int x,int y)
{
if(visit[x][y]==0)
return ;
int nx=x-dx[visit[x][y]-1];
int ny=y-dy[visit[x][y]-1];
lujing(nx,ny);
cout<<temp++<<'s'<<":"<<'('<<nx<<','<<ny<<')'<<"->"<<'('<<x<<','<<y<<')'<<endl;
if(maze[x][y]!='X'&&maze[x][y]!='.')
{
int a=maze[x][y]-'0';
while(a--)
cout<<temp++<<'s'<<":"<<"FIGHT AT "<<'('<<x<<','<<y<<')'<<endl;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
temp=1;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cin>>maze[i][j];
}
memset(visit,0,sizeof(visit));
int ans=bfs();
if(ans==MAX)
cout<<"God please help our poor hero."<<endl;
else
{
cout<<"It takes "<<ans<<" seconds to reach the target position, let me show you the way."<<endl;
lujing(n-1,m-1);
}cout<<"FINISH"<<endl;
}
}