#include<iostream>
using namespace std;
int mp[10][10];
int ax[10],ay[10],yd[10];
int n,flag,c;
struct node
{
int mp[10][10];
};
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
void in()
{
n=read();
for(int i=1;i<=5;i++)
{
for(int j=1;j<=8;j++)
{
int x=read();
if(!x)break;
mp[i][j]=x;
}
}
}
void show()
{
int ss=0;
for(int i=1;i<=n;i++)
{
if(yd[i]<0)ss=0;
else ss=1;
cout<<ax[i]-ss<<" "<<ay[i]-1<<" "<<yd[i]<<endl;
}
}
node G(node &m)
{
for(int i=1;i<=5;i++)
{
int x=0;
for(int j=1;j<=7;j++)
{
if(!m.mp[i][j])x++;
else
{
if(!x)continue;
m.mp[i][j-x]=m.mp[i][j];
m.mp[i][j]=0;
}
}
}
return m;
}
bool E(node &m)
{
int cnt=1,f=0;
int sign[10][10]={0};
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
if(j<=5&&m.mp[i][j]==m.mp[i][j+1]&&m.mp[i][j]==m.mp[i][j+2]&&m.mp[i][j])
{
sign[i][j]=sign[i][j+1]=sign[i][j+2]=1,f=1;
}
if(i<=3&&m.mp[i][j]==m.mp[i+1][j]&&m.mp[i][j]==m.mp[i+2][j]&&m.mp[i][j])
{
sign[i][j]=sign[i+1][j]=sign[i+2][j]=1,f=1;
}
}
}
if(!f)return 0;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
if(sign[i][j])
{
m.mp[i][j]=0;
sign[i][j]=0;
}
if(m.mp[i][j])c++;
}
}
if(c<3&&c!=0){cout<<"-1"<<endl;flag=1;}
return 1;
}
bool compare(node &m)
{
for(int i=1;i<=5;i++)
{
if(m.mp[i][1])return 0;
}
return 1;
}
node check(node &m,int i)
{
swap(m.mp[ax[i]][ay[i]],m.mp[ax[i]+yd[i]][ay[i]]);
m=G(m);
while(E(m))m=G(m);
return m;
}
void dfs(int x,node m)
{
if(flag)return;
if(x>n)
{
flag=compare(m);
if(flag)show();
return;
}
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
ax[x]=i,ay[x]=j;
if(i<5&&m.mp[i+1][j]!=m.mp[i][j])
{
yd[x]=1;
dfs(x+1,check(m,x));
}
if(i>1&&m.mp[i-1][j]==0)
{
yd[x]=-1;
dfs(x+1,check(m,x));
}
}
}
}
void handle()
{
node m;
for(int i=1;i<=5;i++)
{
for(int j=1;j<=7;j++)
{
m.mp[i][j]=mp[i][j];
}
}
dfs(1,m);
}
int main()
{
in();
handle();
}