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

#define mp make_pair
#define mt make_tuple
#define rep(i,begin,end) for (__typeof(begin) i=(begin),_end=(end),_step=1-2*((begin)>(end));i!=_end;i+=_step)

// OUTPUT
template<class a, class b>
ostream& operator << (ostream& os, const pair<a,b>& p)  {
    os<<"("<<p.first<<","<<p.second<<")";
    return os;
}
template<class T>
ostream& operator << (ostream& os, const vector<T>& v)  {
    os<<"[";
    if (!v.size()) 
        os<<"]"; 
    else
        for (int i=0;i<v.size();++i)
            os<<v[i]<<",]"[i==v.size()-1];
    return os;
}
template<class T>
ostream& operator << (ostream& os, const set<T>& s)  {
    os<<"{";
    if (!s.size()) 
        os<<"}"; 
    else
        for (auto x:s)
            os<<x<<",}"[x==*s.rbegin()];
    return os;
}

void printr(ostream& os){os<<endl;}
template<class T, class... Args>
void printr(ostream& os, const T& t, const Args&... args){
    os<<t; if (sizeof...(args)) os<<" ";
    printr(os,args...);
}
#define print(args...) printr(cout,##args)

// INPUT
template<class T>
void read(T& x) {cin>>x;}
template<class T, class... Args>
void read(T& t, Args&... args){
    read(t),read(args...);
}
template<class T>
void readarray(T* A,int n)  {
    rep(i,0,n) read(A[i]);
}


// DEBUG
void dbgr(ostream& os) { os<<endl; }
template<class T, class... Args>
void dbgr(ostream& os, const T& t, const Args&... args) {
    os<<t; if (sizeof...(args)) os<<", ";
    dbgr(os,args...); 
}
#define dbg(args...) cout<<#args<<" = ", dbgr(cout,##args) //cout can be changed


#define maxn 505
#define modu 998244353
typedef long long LL;
typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

// COMMON FUNCTION
// min
template<class T>
T min(const vector<T>& v) { return *min_element(v.begin(),v.end()); }
// max
template<class T>
T max(const vector<T>& v) { return *max_element(v.begin(),v.end()); }

LL pw(LL a,LL k=modu-2) {
    LL ans=1;
    for (a%=modu;k;k>>=1)   {
        if (k&1)
            ans=ans*a%modu;
        a=a*a%modu;
    }
    return ans;
}

int a[maxn][maxn];

int main()  {
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    int n;
    read(n);
    vector<int> pos[3];
    rep(i,0,n)
        rep(j,0,n)
            pos[((i+j)&1)+1].push_back(i*n+j);
    auto draw=[&](int b,int i,int j)  {
        assert(a[i-1][j]!=b);
        assert(a[i+1][j]!=b);
        assert(a[i][j-1]!=b);
        assert(a[i][j+1]!=b);
        a[i][j]=b;
        print(b,i,j);
    };
    auto place=[&](int c,int d)   {
        if (pos[c].size())  {
            draw(d,pos[c].back()/n+1,pos[c].back()%n+1);
            pos[c].pop_back();
            return 1;
        }
        return 0;
    };
    rep(t,0,n*n)    {
        int a;
        cin>>a;
        if (a==1)   {
            if (!place(2,2))
                assert(place(1,3));
        } else
        if (a==2)   {
            if (!place(1,1))
                assert(place(2,3));
        } else
        if (a==3)   {
            if (!place(1,1)) 
                assert(place(2,2));
        }
    }
    return 0;
}
/*README
1. Is modu correct?
2. Is maxn correct?
*/