#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;

struct State{
	int x, y, k;
	State(){}
	State(int x_, int y_, int k_){
		x = x_; y = y_; k = k_;
	}
};

bool is_drop[3][10][10] = {false};
bool ans_flag = false;
int dk[3] = {5,9,13};

int dx[3][13] = {
	{0,0,-1,1,0},
	{-1,-1,-1,0,0,0,1,1,1},
	{-2,-1,-1,-1,0,0,0,0,0,1,1,1,2}
};

int dy[3][13] = {
	{-1,1,0,0,0},
	{-1,0,1,-1,0,1,-1,0,1},
	{0,-1,0,1,-2,-1,0,1,2,-1,0,1,0}
};

// (x,y)に染料 k を落としたかどうか
bool is_fill(int x, int y, int k, const vector<vector<int> > &a){
	for(int i = 0; i < dk[k]; i++){
		int mx = x + dx[k][i];
		int my = y + dy[k][i];
		if( 0 <= mx && mx < 10 && 0 <= my && my < 10 ){
			if( a[my][mx] == 0 ){
				return false;
			}
		}
	}
	return true;
}

// (x,y)の染料 k を落とす前の状態にする
void fill_(int x, int y, int k, vector<vector<int> > &a){
	for(int i = 0; i < dk[k]; i++){
		int mx = x + dx[k][i];
		int my = y + dy[k][i];
		if( 0 <= mx && mx < 10 && 0 <= my && my < 10 ){
			a[my][mx]--;
		}
	}
}

// 全部白いかどうか返す
bool is_white(const vector<vector<int> > &a){
	bool flag = true;
	for(int y = 0; y < 10; y++){
		for(int x = 0; x < 10; x++){
			if( a[y][x] != 0 ){
				return false;
			}
		}
	}
	return true;
}

void solve(int n, vector<vector<int> > &a, vector<State> ans, int ax, int ay){
	if( ans_flag || n < 0 ) return ;
	
	// 解の出力
	if( n == 0 ){
		if( is_white(a) ){
			for(int i = 0; i < ans.size(); i++){
				cout << ans[i].x << " " << ans[i].y << " " << ans[i].k + 1 << endl;
			}
			ans_flag = true;
		}
		return ;
	}
	
	int fill_cnt = 0;
	for(int y = 0; y < 10; y++){
		for(int x = 0; x < 10; x++){
			if( a[y][x] != 0 ){
				int cnt1 = 0, cnt2 = 0;
				for(int i = 0; i < 4; i++){
					int mx = x + dx[0][i], my = y + dy[0][i];
					if( mx < 0 || my < 0 || 10 <= mx || 10 <= my ){
						cnt1++;
					}else{
						if( a[my][mx] != 0 ){
							cnt1++; cnt2++;
						}
					}
				}
				if( cnt2 == 0 ){
					return;
				}
				if( 4 <= cnt1 ){
					fill_cnt++;
				}
			}
		}
	}
	if( fill_cnt == 0 ) return;
	
	/*
	cout << "n:" << n << endl;
	for(int y = 0; y < 10; y++){
		for(int x = 0; x < 10; x++){
			cout << a[y][x] << " ";
		}
		cout << endl;
	}
	cout << endl;
	*/
	
	for(int k = 2; k >= 0; k--){
		for(int y = 0; y < 10; y++){
			for(int x = 0; x < 10; x++){
				if( !is_drop[k][y][x] ) continue;
				
				if( is_fill(x, y, k, a) ){
					ans.push_back( State(x, y, k) );
					vector<vector<int> > a_ = a;
					fill_(x, y, k, a_);
					solve(n-1, a_, ans, x, y);
					ans.pop_back();
				}
			}
		}
	}
}

void init(const vector<vector<int> > &a){
	for(int k = 0; k < 3; k++){
		for(int y = 0; y < 10; y++){
			for(int x = 0; x < 10; x++){
				if( is_fill(x, y, k, a) ){
					is_drop[k][y][x] = true;
				}
			}
		}
	}
}

int main(){
	// n := 染料を落とした回数
	// a := 布の状態
	int n, sum = 0;
	vector<vector<int> > a(10, vector<int>(10));
	
	// 入力
	cin >> n;
	for(int y = 0; y < 10; y++){
		for(int x = 0; x < 10; x++){
			cin >> a[y][x];
			sum += a[y][x];
		}
	}
	
	init(a);

	vector<State> ans;
	solve(n, a, ans, 0, 0);
}