#include<cstdio>
#include<stack>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int maze[10][10];
int d[10][10];
int visit[10][10];
int dx[4] = { -1,1,0,0 };//表示上下左右四个方向
int dy[4] = { 0,0,-1,1 };
struct Node {
	int x, y;
	Node(int r, int c) :x(r), y(c) {};
	Node() {}
} previous[10][10];//记录前一个节点的信息
queue<Node> p;
void bfs()
{
	while (!p.empty())
		p.pop();
	memset(visit, 0, sizeof(visit));
	visit[0][0] = 1;
	d[0][0] = 0;
	p.push(Node(0, 0));//经典bfs用队列,一个点向各个方向扩展,使已经被访问过的节点进入队列末尾,直至这一层的点扩展完了,再进入下一层很好的体现了BFS
	while (!p.empty())//DFS用栈,也能生动体现一走到底,结构几乎一样
	{
		Node t = p.front();
		p.pop();
		int x = t.x, y = t.y;
		for (int i = 0; i < 4; i++){//从四个方向分别扩展
			int next_x = x + dx[i];
			int next_y = y + dy[i];//判断是否需要入队
			if ((next_x >= 0 && next_x < 5 )&& (next_y >= 0 && next_y < 5 )&& visit[next_x][next_y] == 0 && maze[next_x][next_y] == 0)
			{
				visit[next_x][next_y] = 1;
				p.push(Node(next_x, next_y));
				d[next_x][next_y] = 1 + d[x][y];
				previous[next_x][next_y] = Node(x, y);
				if (next_x == 4 && next_y == 4)
					return;
			}
		}
	}


}
int main()
{
	for (int i = 0; i<5; i++)
		for (int j = 0; j<5; j++)
			scanf("%d", &maze[i][j]);
	bfs();
	stack<Node> q;
	int cx = 4, cy = 4;
	while (true)//利用栈倒置输出
	{
		q.push(Node(cx, cy));
		if (cx == 0 && cy == 0) 
			break;
		int px = cx, py = cy;
		cx = previous[px][py].x;
		cy = previous[px][py].y;
	}
	while (!q.empty())
	{
		Node t = q.top();
		q.pop();
		printf("(%d, %d)\n", t.x, t.y);
	}
    return 0;
}