/*
ID: espr1t
TASK: 
KEYWORDS: 
*/

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <random>
#include <queue>

using namespace std;
FILE* in = stdin; FILE* out = stdout;

mt19937 mt;
int randd() {
    int ret = mt();
    return ret < 0 ? -ret : ret;
}

const int MAX = 101;

struct Cell {
    int row, col;
    Cell(int row_ = 0, int col_ = 0) : row(row_), col(col_) {};
};

int n;
queue <Cell> odd, even;
int board[MAX][MAX];
int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };


int getSize() {
    int size = randd() % 99 + 2;
    #ifndef LOCAL
        fscanf(in, "%d", &size);
    #endif
    return size;
}

int getColor() {
    int color = randd() % 3 + 1;
    #ifndef LOCAL
        fscanf(in, "%d", &color);
    #endif
    return color;
}

void play(int row, int col, int color) {
//    fprintf(stderr, "Playing color %d at cell (%d, %d)\n", color, row, col);
    if (board[row][col] != 0) {
        fprintf(stderr, "Cell (%d, %d) is already filled!\n", row, col);
        exit(-1);
    }
    for (int i = 0; i < 4; i++) {
        int nrow = row + dir[i][0]; if (nrow < 0 || nrow >= n) continue;
        int ncol = col + dir[i][1]; if (ncol < 0 || ncol >= n) continue;
        if (board[nrow][ncol] == color) {
            fprintf(stderr, "WTF? Using the same color for two neighboring cells.\n");
            exit(-1);
        }
    }
    
    board[row][col] = color;
    #ifndef LOCAL
        fprintf(out, "%d %d %d\n", color, row + 1, col + 1);
        fflush(out);
    #endif
}

bool playEven(int color) {
    if (even.empty())
        return false;
    play(even.front().row, even.front().col, color);
    even.pop();
    return true;
}

bool playOdd(int color) {
    if (odd.empty())
        return false;
    play(odd.front().row, odd.front().col, color);
    odd.pop();
    return true;
}

void solve() {
    n = getSize();
    for (int row = 0; row < n; row++) {
        for (int col = 0; col < n; col++) {
            if ((row + col) % 2) {
                even.push(Cell(row, col));
            } else {
                odd.push(Cell(row, col));
            }
        }
    }
    for (int i = 0; i < n * n; i++) {
        int forbidden = getColor();
        if (forbidden == 1 || forbidden == 3) {
            if (!playEven(2))
                playOdd(forbidden == 1 ? 3 : 1);
        } else {
            if (!playOdd(1))
                playEven(3);
        }
    }
}

int main(void) {
    solve();
	return 0;
}
