#include<iostream>
#include<vector>
#include<map>
#include<algorithm> 
#include<math.h>
#include<set>
#include<stack>
#include<queue>
#include<memory.h>
using namespace std;

int Map[20][20];//点状态 墙壁或者路径
int pre[20][20];//如何到达当前点

// 移动方式-左右上下
int dx[4] = {0,0,-1,1};
int dy[4] = { -1,1,0,0 };

int main() {
    memset(pre, -1, sizeof pre);//初始化到达方式
    queue<pair<int, int>> points;//遍历到的位置
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> Map[i][j];
        }
    }
    ///输入结束
  
    //从起点开始搜索
    pair<int, int> target = pair<int, int>(n - 1, m - 1);//终点位置
    points.push(pair<int, int>(0, 0));
    while (!points.empty()) {
        bool find = false;
        pair<int, int> p = points.front();
        points.pop();
        for (int i = 0; i < 4; i++) {
            int new_x = p.first + dx[i];
            int new_y = p.second + dy[i];
            
            if (new_x<0 || new_x>n - 1 || new_y<0 || new_y>m - 1||Map[new_x][new_y]==1) continue;//排除走不了的点
            if (pre[new_x][new_y] != -1) continue;//已经遍历过了

            pre[new_x][new_y] = i;//到达方式
            pair<int, int> p_new = pair<int, int>(new_x, new_y);//新到达的点
            if (p_new == target) {//已经到达终点了
                break;
                find = true;
            }
            else {
                points.push(p_new);
            }
        }
        if (find)break;//已经到达终点了
    }
    //使用栈查找来时路径-从终点到起点入栈
    stack< pair<int, int>> solution;
    int p_x = n-1, p_y = m-1;
    solution.push(target);
    while (!(p_x == 0 && p_y == 0)) {
        //更新位置
        int d_x = dx[pre[p_x][p_y]];
        int d_y= dy[pre[p_x][p_y]];
        p_x -= d_x;
        p_y -= d_y;
        //加入点
        solution.push(pair<int, int>(p_x, p_y));
    }
    //使用栈查找来时路径-从起点到终点出栈
    while (!solution.empty()) {
        pair<int, int> p = solution.top();
        solution.pop();
        cout << "(" << p.first << "," << p.second << ")" << endl;
    }
    return 0;
}