import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    static class Point{

        private int x,y,z;
        public Point(int x,int y,int z)
        {
            this.x=x;
            this.y=y;
            this.z=z;
        }

    }
    private  static int h,w;
    private static int [][] direction={{0,1},{1,0},{0,-1},{-1,0}};
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别

        h= in.nextInt();
        w = in.nextInt();



        // 构造迷宫
        int[][] map = new int[h][w];
        int[][] map1 = new int[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                map1[i][j]=map[i][j] = in.nextInt();
            }
        }
        List<Point> fromPath =new ArrayList<>();
        List<Point> toPath =new ArrayList<>();
        bfs(map,0,0,1,fromPath);
//        System.out.println();

        bfs(map1,h-1,w-1,-1,toPath);

        List<Point> path =new ArrayList<>();

        Set<Point> set =new HashSet<>();

        while (toPath.size()>0 && fromPath.size()>0)
        {
            Point toP =toPath.get(0);
            Point  fromP = fromPath.get(fromPath.size() - 1);
            Point remove;
            if(fromP.x==toP.x && fromP.y==toP.y)
            {

                path.add(toP);
                toPath.remove(0);
                fromPath.remove(fromPath.size() - 1);

            }
            else {
                boolean find =false;

                for (Point point : fromPath) {
                    if(point.x==toP.x && point.y==toP.y)
                    {
                        find=true;
                        break;

                    }
                }
                if (!find)
                {
                    toPath.remove(0);
                    continue;

                }
                remove= fromPath.remove(fromPath.size() - 1);
                set.add(remove);

                for (Point point : set) {
                    if(point.x==toP.x && point.y==toP.y)
                    {
                        toPath.remove(0);
                        break;
                    }
                }
//                if(!find)
//                {
//                    toPath.remove(0);
//                }




            }

//            remove = fromPath.remove(fromPath.size() - 1);
//            set.add(remove);
        }
        // System.out.println();

        for (int i = path.size()-1; i >=0 ; i--) {
            System.out.println("("+path.get(i).x+","+path.get(i).y+")");

        }




    }


    public static void bfs(int[][] map,int x,int y,int order,List<Point> path)
    {
        int count=0;
        Queue<Point> que =new ArrayDeque<>();
        Point p =new Point(x,y,count++);

        map[x][y]=2;
        que.offer(p);
        while(!que.isEmpty())
        {

            Point cur =que.peek();
            path.add(cur);
//            System.out.println("(" + cur.x + "," + cur.y +","+cur.z+ ") ");
            que.poll();
            if (cur.x==h-1 && cur.y==w-1 && order==1)
            {
                return;
            }
            if (cur.x==0 && cur.y==0 && order==-1)
            {
                return;
            }


            for(int i=0;i<4;i++)
            {
                int nextX =cur.x+direction[i][0];
                int nextY =cur.y+direction[i][1];
                if(nextX<0||nextX>h-1||nextY<0||nextY>w-1)
                {
                    continue;
                }
                if(map[nextX][nextY]==0)
                {
                    que.offer(new Point(nextX,nextY,count++));
                    map[nextX][nextY]=2;

                }


            }

        }


    }


}

正走再倒走,找到合理的路径上的点