import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Main { public static int[][] directions = { {0, 1}, {1, 0}, {-1, 0}, {0, -1} }; private static Stack<int[]> path; private static ArrayList<int[]> minPath; private static int[][] matrix; private static boolean[][] visited; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str1 = null; while ((str1 = br.readLine()) != null) { String[] arr = str1.split(" "); int rows = Integer.parseInt(arr[0]); int cols = Integer.parseInt(arr[1]); path = new Stack<>(); minPath = null; matrix = new int[rows][cols]; visited = new boolean[rows][cols]; for (int i = 0; i < rows; i++) { String[] str2 = br.readLine().split(" "); for (int j = 0; j < cols; j++) { matrix[i][j] = Integer.parseInt(str2[j]); } } dfs(0, 0); StringBuilder sb = new StringBuilder(); for (int[] res : minPath) { sb.append('(').append(res[0]).append(',').append(res[1]).append(")\n"); } System.out.print(sb.toString()); } } private static void dfs(int i, int j) { if (i > matrix.length - 1 || i < 0 || j > matrix[0].length - 1 || j < 0 || visited[i][j] || matrix[i][j] == 1 || (minPath != null && path.size() >= minPath.size())) { return; } if (i == matrix.length - 1 && j == matrix[0].length - 1) { path.add(new int[]{i, j}); minPath = new ArrayList<>(path); path.pop(); return; } path.add(new int[]{i, j}); visited[i][j] = true; for (int[] direction : directions) { dfs(i + direction[0], j + direction[1]); } visited[i][j] = false; path.pop(); } }