#include<bits/stdc++.h>
using namespace std;
#define lop(i,n) for(i=0;i<n;i++)
#define lop1(i,n) for(ll i=1;i<=n;i++)
#define lopr(i,n) for(i=n-1;i>=0;i--)
#define ll long long int
#define pb push_back
#define all(v) v.begin(),v.end()
#define IOS  ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define endl "\n"
#define F first
#define S second
#define mem(arr,val) memset(arr,val,sizeof(arr))
#define pii pair<int,int>
#define pll pair<ll,ll>
#define LCM(a,b) (a*b)/__gcd(a,b)
#define mii map<int,int>
#define mll map<ll,ll>
#define ub upper_bound
#define lb lower_bound
#define sz(x) (ll)x.size()
#define ld long double
#define pcnt(x) __builtin_popcountll(x)
const long long I1 = 1e9 + 7;
const long long I2 = 1e18;
const long long MAXM = 1e5 + 5;

template<typename T, typename T1>T maxn(T &a, T1 b) {if (b > a)a = b; return a;}
template<typename T, typename T1>T minn(T &a, T1 b) {if (b < a)a = b; return a;}

bool isPrime(ll n)
{
  // Corner case
  if (n <= 1)
    return false;

  // Check from 2 to n-1
  for (ll i = 2; i < n; i++)
    if (n % i == 0)
      return false;

  return true;
}

ll find(vector<ll> a[], vector<ll> b[], ll x, ll n, ll ctx[], ll cty[]) {
  ll i, j;
  ll ans = 0;
  ll t1, t2, t3;
  for (i = x; i < n; i++) {
    for (j = 0; j < n; j++) {
      if (a[i][j] == -1) {
        t1 = I1, t2 = I1, t3 = I1;
        a[i][j] = 0;
        if (ctx[i]) {
          ctx[i] = 0;
          t1 = find(a, b, i, n, ctx, cty);
          ctx[i] = 1;
        }
        if (cty[j]) {
          cty[j] = 0;

          t2 = find(a, b, i, n, ctx, cty);
          cty[j] = 1;
        }
        t3 = b[i][j] + find(a, b, i, n, ctx, cty);
        ans += min(min(t1, t2), t3);
        return ans;
      }
    }
  }
  return ans;
}
ll check(ll a[], ll n, ll m) {
  ll i;
  ll c, temp;
  for (i = 1; i < n; i++) {
    if (a[i] < a[i - 1])
      c = a[i] - a[i - 1] + m;
    else
      c = a[i] - a[i - 1];
    if (i == 1)
      temp = c;
    if (i != 1 && c != temp)
      break;
  }
  if (i == n)
    return temp;
  return -1;
}
void reverse(int val, int* a, int n) {
  int y = -1, temp;
  int p = n - val + 1;
  int x;
  int i;
  lop(i, n) {
    if (a[i] == p) {
      x = i;
      break;
    }
  }
  for (i = 0; i < n; i++) {
    if (a[i] > p) {
      y = i;
      break;
    }
    else if (a[i] == p)
      break;
  }
  if (y == -1) {
    for (i = n - 1; i >= 0; i--) {
      if (a[i] > p) {
        y = i;
        break;
      }
    }
  }
  if (x > y) {
    temp = x;
    x = y;
    y = temp;
  }

  while (x < y) {
    temp = a[x];
    a[x] = a[y];
    a[y] = temp;
    x++;
    y--;
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  int n;
  cin >> n;
  vector<pair<int, int>> a1, a2;
  int i, j;
  for (i = 0; i < n; i += 2) {
    lop(j, n) {
      if (j % 2 == 0)
        a1.pb(make_pair(i, j));
      else
        a2.pb(make_pair(i, j));
    }
  }
  for (i = 1; i < n; i += 2) {
    lop(j, n) {
      if (j % 2 != 0)
        a1.pb(make_pair(i, j));
      else
        a2.pb(make_pair(i, j));
    }
  }
  int l = 0, m = 0, x;
  lop(i, n * n) {
    cin >> x;
    if (x == 1) {
      if (m < a2.size()) {
        cout << 2 << " " << a2[m].F + 1 << " " << a2[m].S + 1 << endl;
        m++;
      }
      else {
        cout << 3 << " " << a1[l].F + 1 << " " << a1[l].S + 1 << endl;
        l++;
      }
    }
    else if (x == 2) {
      if (l < a1.size()) {
        cout << 1 << " " << a1[l].F + 1 << " " << a1[l].S + 1 << endl;
        l++;
      }
      else {
        cout << 3 << " " << a2[m].F + 1 << " " << a2[m].S + 1 << endl;
        m++;
      }
    }
    else {
      if (l < a1.size()) {
        cout << 1 << " " << a1[l].F + 1 << " " << a1[l].S + 1 << endl;
        l++;
      }
      else {
        cout << 2 << " " << a2[m].F + 1 << " " << a2[m].S + 1 << endl;
        m++;
      }
    }
    cout.flush();
  }
  return 0;
}