#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,mp[N][N],u,ansx[N],ansy[N],ansd[N];
inline void confirm()
{
bool flag=true;
for(int i=1;i<=5;i++)if(mp[i][1])flag=false;
if(flag)for(int i=1;i<=n;i++)
cout<<ansx[i]-1<<" "<<ansy[i]-1<<" "<<ansd[i]<<endl;
if(flag)exit(0);
}
inline bool xiao()
{
bool xi[N][N],flag=false;
memset(xi,0,sizeof(xi));
for(int i=1;i<=5;i++)for(int j=1;mp[i][j];j++)
{
int r;
for(r=i+1;r<=5;r++)if(mp[i][j]!=mp[r][j])break;
if(r-i>=3)for(int k=i;k<r;k++)xi[k][j]=true;
for(r=j+1;r<=7;r++)if(mp[i][j]!=mp[i][r])break;
if(r-j>=3)for(int k=j;k<r;k++)xi[i][k]=true;
}
for(int i=1;i<=5;i++)for(int j=1;j<=7;j++)
if(xi[i][j])mp[i][j]=0,flag=true;
if(!flag)return false;
for(int i=1;i<=5;i++)for(int j=1;j<=7;j++)
if(!mp[i][j])
{
int k=j+1;
for(;k<=7;k++)if(mp[i][k])break;
mp[i][j]=mp[i][k];mp[i][k]=0;
}
return true;
}
inline void dfs(int now)
{
for(int i=1;i<=5;i++)for(int j=1;mp[i][j];j++)
{
if(i!=5&&mp[i][j]!=mp[i+1][j]&&mp[i+1][j])
{
int tp[N][N];
memcpy(tp,mp,sizeof(tp));
swap(mp[i][j],mp[i+1][j]);
ansx[now]=i;ansy[now]=j;ansd[now]=1;
while(xiao()){}
if(now==n)confirm();
else dfs(now+1);
memcpy(mp,tp,sizeof(mp));
}
if(i!=5&&!mp[i+1][j])
{
int tp[N][N];
memcpy(tp,mp,sizeof(tp));
int k;
for(k=j-1;k>=1;k--)if(mp[i+1][k])break;
mp[i+1][++k]=mp[i][j];mp[i][j]=0;
for(int e=j;e<=6;e++)
{mp[i][e]=mp[i][e+1];mp[i][e+1]=0;}
ansx[now]=i;ansy[now]=j;ansd[now]=1;
while(xiao()){}
if(now==n)confirm();
else dfs(now+1);
memcpy(mp,tp,sizeof(mp));
}
if(i!=1&&!mp[i-1][j])
{
int tp[N][N];
memcpy(tp,mp,sizeof(tp));
int k;
for(k=j-1;k>=1;k--)if(mp[i-1][k])break;
mp[i-1][++k]=mp[i][j];mp[i][j]=0;
for(int e=j;e<=6;e++)
{mp[i][e]=mp[i][e+1];mp[i][e+1]=0;}
ansx[now]=i;ansy[now]=j;ansd[now]=-1;
while(xiao()){}
if(now==n)confirm();
else dfs(now+1);
memcpy(mp,tp,sizeof(mp));
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=5;i++)
{
int tmp=0;
while(cin>>u){if(!u)break;mp[i][++tmp]=u;}
}
dfs(1);
cout<<-1<<endl;
return 0;
}