#include<bits/stdc++.h>
using namespace std;
int n,a[10][10],t[10];
bool vis[10][10];
struct node{
int x,y,g;
};
vector<node> v;
inline bool check(){
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
if(a[i][j])
return 0;
return 1;
}
inline bool c(int x,int y){
return x>=0&&x<5&&y>=0&&y<7;
}
inline bool ch(int x,int y,int xq,int yq){
return c(x,y)&&a[x][y]==a[xq][yq];
}
inline void down(){
for(int i=0;i<5;++i){
int cnt=0;
for(int j=0;j<7;++j)
if(a[i][j])
t[cnt++]=a[i][j];
for(int j=0;j<cnt;++j)
a[i][j]=t[j];
for(int j=cnt;j<7;++j)
a[i][j]=0;
}
return;
}
inline bool work(){
memset(vis,0,sizeof(vis));
bool p=0;
for(int i=0;i<5;++i)
for(int j=0;j<7;++j){
if(!a[i][j])
break;
bool x=0;
if(ch(i-2,j,i,j)&&ch(i-1,j,i,j))
vis[i-2][j]=vis[i-1][j]=vis[i][j]=p=1;
if(ch(i,j-2,i,j)&&ch(i,j-1,i,j))
vis[i][j-2]=vis[i][j-1]=vis[i][j]=p=1;
}
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
if(vis[i][j])
a[i][j]=0;
down();
return p;
}
unordered_map<string,int> mp;
void dfs(int x){
if(x>n)
return;
if(check()){
if(x!=n)
return;
for(int i=0;i<n;++i)
printf("%d %d %d\n",v[i].x,v[i].y,v[i].g);
exit(0);
}
string s="\0";
for(int i=0;i<5;++i)
for(int j=0;j<7;++j)
s+=(a[i][j]^'0');
if(mp.count(s)&&x>=mp[s])
return;
mp[s]=x;
int b[10][10]={};
for(int i=0;i<5;++i)
for(int j=0;j<7;++j){
if(!a[i][j])
break;
for(int o=0;o<5;++o)
for(int p=0;p<7;++p)
b[o][p]=a[o][p];
if(c(i+1,j)&&a[i][j]!=a[i+1][j]){
swap(a[i][j],a[i+1][j]);
while(work());
v.push_back(node({i,j,1}));
dfs(x+1);
v.pop_back();
for(int o=0;o<5;++o)
for(int p=0;p<7;++p)
a[o][p]=b[o][p];
}
if(c(i-1,j)&&!a[i-1][j]){
swap(a[i][j],a[i-1][j]);
while(work());
v.push_back(node({i,j,-1}));
dfs(x+1);
v.pop_back();
for(int o=0;o<5;++o)
for(int p=0;p<7;++p)
a[o][p]=b[o][p];
}
}
}
int main(){
scanf("%d",&n);
for(int i=0;i<5;++i)
for(int j=0;j<8;++j){
scanf("%d",&a[i][j]);
if(!a[i][j])
break;
}
dfs(0);
puts("-1");
return 0;
}