#include <bits/stdc++.h>
using namespace std;

#define fr(i,n) for(int i = 0; i<n; i++)
#define sz(v) (int)(v.size())
#define prin(a) cout << #a << " = " << a << endl
#define prinv(v) cout << #v << " = "; for(auto it : v) cout << it << ", "; cout << endl
#define all(v) (v).begin(),(v).end()

typedef long long ll;

#define rmin(a,b) a = min<ll>(a,b)
#define rmax(a,b) a = max<ll>(a,b)

#define fi first
#define se second

int i0 = 0, i1 = 1;
int cor0 = -1, cor1 = -1;
int corban;

int ltn[256];

ll gera(ll minx, ll maxx){
	assert(maxx>=minx);
	return minx + rand()%(maxx-minx+1);
}

void leban(){
	char c; cin >> c;
	corban = ltn[c];
	//corban = gera(0,2);
	//prin(corban+1);
};

bool fim0 = 0, fim1 = 0;

pair<int,int> pi0(-1,-1), pi1(-1,-1);

int n; 

void reseta0(){
	pi0 = {-1,-1};
	fim0 = 0;
}

void reseta1(){
	pi1 = {-1,-1};
	fim1 = 0;
}

vector<char> letras = {'1','2','3'};

const int N = 110;
int mat[N][N], vis[N][N];

int cp = 0;
void printa(int cor, int i, int j){
	cp++;
	//assert(!vis[i][j]);
	cout << letras[cor] << " " << i+1 << " " << j+1 << endl;
	//mat[i][j] = cor;
	//vis[i][j] = 1;
	//assert(cor!=corban);
}

int getanydif(vector<int> cbs){
	fr(cor,3){
		int ok = 1;
		for(auto &cb : cbs) if(cor==cb) ok = 0;
		if(ok) return cor;
	}
	assert(0);
	return -1;
}

void poe0(){
	int i,j; tie(i,j) = pi0;
	if(i==-1){
		assert(i0<2*n-1);
		i = i0;
		j = 0;
		if(i>=n){
			j = i-(n-1);
			i = n-1;
		}
	}
	if(cor0==-1){
		cor0 = getanydif({cor1,corban});
	}
	printa(cor0,i,j);
	i--,j++;
	if(i==-1 or j==n){
		fim0 = 1;
	}
	pi0 = {i,j};
}

void poe1(){
	int i,j; tie(i,j) = pi1;
	//assert(!fim1);
	if(i==-1){
		assert(i1<2*n-1);
		i = i1;
		j = 0;
		if(i>=n){
			j = i-(n-1);
			i = n-1;
		}
	}
	if(cor1==-1){
		cor1 = getanydif({cor0,corban});
	}
	printa(cor1,i,j);
	i--,j++;
	if(i==-1 or j==n){
		fim1 = 1;
	}
	pi1 = {i,j};
}

void trocar(){
	swap(i0,i1);
	swap(cor0,cor1);
	swap(pi0,pi1);
	swap(fim0,fim1);
}

void lixo0(){
	if(i0>=2*n-1) return;
	while(!fim0){
		//cin >> corban;
		leban();
		cor0 = -1;
		poe0();
	}
}

void lixo1(){
	if(i1>=2*n-1) return;
	while(!fim1){
		//cin >> corban;
		leban();
		cor1 = -1;
		poe1();
	}
}

void prinstat(){
	prin(i0);
	prin(i1);
	prin(cor0);
	prin(cor1);
}


int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin >> n;
	
	/*auto seed = 1617466826;//time(0);
	srand(seed);
	prin(seed);
	*/
	
	ltn['1'] = 0;
	ltn['2'] = 1;
	ltn['3'] = 2;
	
	ltn['a'] = 0;
	ltn['b'] = 1;
	ltn['c'] = 2;
	
	while(1){
		//cin >> corban;
		leban();
		if(corban!=cor0){
			//prin(cor0);
			poe0();
		} else{ 
			//prin(cor1);
			poe1();
		}
		
		if(fim0){
			//prin(fim0);
			//prinstat();
			i0 +=2;
			reseta0();
			trocar();
			//cout << endl;
			//prinstat();
		} else if(fim1){
			//prin(fim1);
			//prinstat();
			lixo0();
			i0+=2;
			i1+=2;
			cor0 = -1;
			reseta1();
			reseta0();
			/*cout << endl;
			prinstat();
			prin(fim1);
			*/
		}
		if(i0>=2*n-1){
			lixo1();
			break;
		}
		if(i1>=2*n-1){
			lixo0();
			break;
		}
	}
	
	/*
	fr(i,n){
		fr(j,n) cout << " " << mat[i][j];
		cout << endl;
	}
	
	prin(cp);
	
	fr(i,n) fr(j,n){
		assert(vis[i][j]);
		if(i+1<n) assert(mat[i][j]!=mat[i+1][j]);
		if(j+1<n) assert(mat[i][j]!=mat[i][j+1]);
	}*/
}
