#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define LL long long
#define rerange(i,a,b) for(int i=a;i>=b;--i)
#define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
using namespace std;
int map[5][5],id[5][5],dx[4]={1,-1,0,0},dy[4]={0,0,-1,1};
struct node{
int x,y,step;
queue<int>p;
node(bool flag=false){if(flag){x=y=step=0;p.push(0),p.push(0);}}
};
void init(){
range(i,0,4)range(j,0,4)cin>>map[i][j];
}
bool judge(int x,int y){
if(x<0||y<0||x>5||y>5)return false;
else return true;
}//判断边界
void solve(){
fill(id,0);
queue<node>q;
id[0][0]=1;
q.push(node(true));
while(!q.empty()){
node t1=q.front();
q.pop();
if(t1.x==4&&t1.y==4)
while(!t1.p.empty()){
int x=t1.p.front();
t1.p.pop();
int y=t1.p.front();
t1.p.pop();
cout<<"("<<x<<", "<<y<<")"<<endl;
}
range(i,0,3){
node t2=t1;
t2.x+=dx[i];
t2.y+=dy[i];
if(!id[t2.x][t2.y]&&judge(t2.x,t2.y)&&!map[t2.x][t2.y]){
t2.p.push(t2.x);
t2.p.push(t2.y);
t2.step++;
id[t2.x][t2.y]=1;
q.push(t2);
}
}
}
}
int main() {
init();
solve();
return 0;
}