package main

import (
    "fmt"
)

type Node struct{
    x,y int
    path [][]int // 从起点到该点的路径
}

func main() {
    var h,w int 
    fmt.Scanf("%d %d", &h, &w)
    var k = make([][]int, h)
    var v = make([][]bool,h)
    for i:=0;i<h;i++{
        k[i] = make([]int, w)
        v[i] = make([]bool, w)
        for j:=0;j<w;j++{
            fmt.Scanf("%d", &k[i][j])
        }
    }

    queue := []Node{{0,0,[][]int{{0,0}}}}
    v[0][0] = true
    var dist [][]int = [][]int{{1,0}, {-1,0}, {0,-1}, {0,1}}
    for len(queue) > 0 {
        cur := queue[0]
        queue = queue[1:]
        if cur.x == h-1 && cur.y == w-1 {
            for _, d := range cur.path {
                fmt.Printf("(%d,%d)\n", d[0],d[1])
            }
            return
        }

        for _, d := range dist {
            ni, nj := cur.x + d[0], cur.y + d[1]
            if ni<0 || ni>=h || nj<0 || nj>=w || v[ni][nj] || k[ni][nj] == 1 {
                continue
            }
            v[ni][nj] = true
            // 创建新路径:复制 cur.path
            newPath := make([][]int, len(cur.path))
            copy(newPath, cur.path)
            newPath = append(newPath, []int{ni,nj})
            /* 
                注意:append(cur.path,[]int{ni,nj})是使用同一个底层数组,不是深复制
                所有path实际共用同一个底层数组,这是不正确的
             */
            queue = append(queue, Node{ni,nj, newPath})
        }
    }
}