#include <stdio.h>
#include<malloc.h>
// int rec[100][2];
// int n,m;
// int **mz;
// int cnt;
// int flag;
// void dfs(int x,int y)
// {
// rec[cnt][0]=x;
// rec[cnt++][1]=y;
// mz[x][y]=1;
// if(x==m-1 && y==n-1){
// flag=1;
// return ;
// }
// if(x-1>=0 && mz[x-1][y]==0 && !flag)dfs(x-1,y);
// if(x+1<m && mz[x+1][y]==0 && !flag)dfs(x+1,y);
// if(y-1>=0 && mz[x][y-1]==0 && !flag)dfs(x,y-1);
// if(y+1<n && mz[x][y+1]==0 && !flag)dfs(x,y+1);
// if(flag)return;
// cnt--;
// mz[x][y]=0;
// }
// int main() {
// int i, j;
// scanf("%d%d", &n, &m);
// //二维数组动态分配
// mz = (int**)malloc(n * sizeof(int*));
// for ( i = 0; i < n; i++)
// mz[i] = (int*)malloc(m * sizeof(int ));
// //初始化
// for (i = 0; i < n; i++)
// for (j = 0; j < m; j++)
// scanf("%d", &mz[i][j]);
// dfs(0,0);
// for(int i=0;i<cnt;i++){
// printf("(%d,%d)\n",rec[i][0],rec[i][1]);
// }
// return 0;
// }
int mz[20][20];
int m,n;
int cnt;
int flag;
int save[100][2];
void dfs(int x,int y)
{
save[cnt][0]=x;
save[cnt++][1]=y;
mz[x][y]=1;
if(x==m-1 && y==n-1){
flag=1;
return ;
}
if(x-1>=0 && mz[x-1][y]==0 && !flag)dfs(x-1,y);
if(x+1<m && mz[x+1][y]==0 && !flag)dfs(x+1,y);
if(y-1>=0 && mz[x][y-1]==0 && !flag)dfs(x,y-1);
if(y+1<n && mz[x][y+1]==0 && !flag)dfs(x,y+1);
if(flag)return;
cnt--;
mz[x][y]=0;
}
int main(void)
{
while(scanf("%d %d",&m,&n)!=EOF){
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
scanf("%d",&mz[i][j]);
}
}
cnt=0;
flag=0;
dfs(0,0);
for(int i=0;i<cnt;i++){
printf("(%d,%d)\n",save[i][0],save[i][1]);
}
}
return 0;
}