#include  bits/stdc++.h    using namespace std;   #define all(x) x.begin(),x.end()   #define pb push_back   #define ff first   #define ss second   #define fast ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)   #define ar array   #define int long long    #define F(i,a,b) for(i=a;i<b;++i)   #define RF(i,b,a) for(i=b;i>=a;--i)    #define NL cout<<  n ;   #define INF LONG_LONG_MAX   #define pii pair<int,int>   #define vi vector<int>      typedef long long ll;   typedef long double ld;   const ll mod=1e9+7;   bool comp(ll a,ll b)   {    return a<b;   }   ll fpow(ll a, ll b) {       ll res=1;    while(b) {     if(b&1)      res=(res*a);     a=(a*a);     b>>=1;    }    return res;   }      ll minm(ll a,ll b){    if(a<b) return a;    return b;   }      ll maxm(ll a,ll b){    if(a>b){ return a;}    else return b;   }      int PHI(int k){    // This is Euler s Totient Function.    //This function returns no. of coprime numbers to N in range [1,2,....,N]         int ans=k;      for(int i=2;i*i<=k;++i){       if(k%i==0){        ans-=ans/i;        while(k%i==0){         k/=i;        }       }      }        if(k>1) ans-=ans/k;        return ans;          }      void solve(){           int n,i;      cin >> n;            vector<pii>ecells;      vector<pii>ocells;            for(i=1;i<=n;i++){       for(int j=1;j<=n;j++){        if((i+j)%2){         ocells.pb({i,j});        }        else ecells.pb({i,j});       }      }            // 1 even      // 2,3 odd      // if not possible ie all odd are filled, fill 2,3 in even            int cnt=0;            while(cnt<n*n){       int a; cin >> a;              if(a==1){         // try to fill 2 in odd cell          // if not possible , fill 3 in even         if(ocells.empty()){          cout<< 3  <<ecells.back().ff<<   <<ecells.back().ss<<endl;          ecells.pop_back();         }                  else{          cout<< 2  <<ocells.back().ff<<   <<ocells.back().ss<<endl;          ocells.pop_back();         }         ++cnt;       }              else if(a==2){        // fill 1 in even , if possible        if(!ecells.empty()){         cout<< 1  <<ecells.back().ff<<   <<ecells.back().ss<<endl;         ecells.pop_back();        }                else{         // fill 3 in ocells         cout<< 3  <<ocells.back().ff<<   <<ocells.back().ss<<endl;         ocells.pop_back();        }        cnt++;       }       else{        // fill 1 in even if possible        if(!ecells.empty()){         cout<< 1  <<ecells.back().ff<<   <<ecells.back().ss<<endl;         ecells.pop_back();        }        else{         // fill 2 in odd         cout<< 2  <<ocells.back().ff<<   <<ocells.back().ss<<endl;         ocells.pop_back();        }        cnt++;       }      }                  }         signed main(void)        {       fast;            int _=1;    //cin>>_;             for(int test_case=1;test_case<=_;++test_case){            solve();         }             }