#include <stdio.h>
#define MAX_ 100000;
char map[100][100];
typedef struct {
int x ,y ,time ,front;
}point;
int dir[4][2] = {-1,0,0,1,1,0,0,-1} ,mintime[100][100];
int n , m ,I ,J;
point arr[1000000];
void bfs ()
{
while (I != J)//队列不为空
{
point head = arr[I++];
for (int i = 0 ;i <= 3 ;i++)
{
int x = head.x + dir[i][0] ,y = head.y + dir[i][1];
if (x >= 0 && y >= 0 && x < m && y < n && map[x][y] != 'X')
{
point k;
k.time = head.time + 1;
if (map[x][y] != '.')
k.time += map[x][y] - '0';
if(k.time < mintime[x][y])//若到达minttime[x][y]时间小于其他点到此点时间,此点入队
{
mintime[x][y] = k.time;
k.x = x ,k.y = y;
k.front = I - 1;
//printf("%d---%d---%d---%d\n",k.x ,k.y ,k.time ,k.front);
arr[J++] = k;
}
}
}
}
}
int main()
{
while (scanf("%d %d",&m,&n) != EOF)
{
for (int i = 0 ;i < m ;i++)
for (int j = 0 ;j < n ;j++)
{
scanf(" %c",&map[i][j]);
mintime[i][j] = MAX_;
}
//队列第一个元素赋值
arr[0].x = m - 1 ,arr[0].y = n - 1 ,arr[0].time = 0 ,arr[0].front = -1 ,mintime[m-1][n-1] = 0;
if (map[m-1][n-1] != 'X' && map[m-1][n-1] != '.') mintime[m - 1][n - 1] = arr[0].time = map[m-1][n-1] - '0';
I = 0 ,J = 1;
int time = 1;
//执行搜索
bfs ();
//不能到达
if (mintime[0][0] == 100000)
printf ("God please help our poor hero.\n");
else
{
printf ("It takes %d seconds to reach the target position, let me show you the way.\n",mintime[0][0]);
point s = arr[I-1];
while (s.x != 0 || s.y !=0)
s = arr[--I];
int p ,time = 1 ,x ,y;
//打印路径
while (s.front >= 0)
{
p = s.front;
x = arr[p].x ,y = arr[p].y;
printf ("%ds:(%d,%d)->(%d,%d)\n",time++,s.x,s.y,x,y);
if (map[x][y] != 'X' && map[x][y] != '.')
for(int i = 1 ;i <= map[x][y] - '0' ;i++)
printf("%ds:FIGHT AT (%d,%d)\n",time++,x,y);
s = arr[p];
}
}
printf ("FINISH\n");
}
return 0;
}