#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; int n,nn,i,j,tot,ntot,a[44][44],b[(1<<25)+5],r[44],c[44],s[7][7]; void inc(int i, int j) { int msk=(1<<(a[i][j]-1)); r[i]^=msk; c[j]^=msk; s[i/n][j/n]^=msk; tot++; } void dec(int i, int j) { if (a[i][j]==0) return; int msk=(1<<(a[i][j]-1)); r[i]^=msk; c[j]^=msk; s[i/n][j/n]^=msk; tot--; a[i][j]=0; } void rev(const vector<pii>& v) { for (int i=0; i<v.size(); i++) dec(v[i].first,v[i].second); } bool rec() { vector<pii> v; while (tot<ntot) { int best=100,wi=0,wj=0; for (int i=0; i<nn; i++) for (int j=0; j<nn; j++) if (a[i][j]==0) { int msk=(r[i]&c[j]&s[i/n][j/n]); if (b[msk]==0) { rev(v); return false; } if (b[msk]==1) { for (int e=0; e<nn; e++) if (msk&(1<<e)) { a[i][j]=e+1; inc(i,j); v.push_back({i,j}); break; } } if (b[msk]<best) { best=b[msk]; wi=i; wj=j; } } if (best==100) break; if (best>=2) { int msk=(r[wi]&c[wj]&s[wi/n][wj/n]); v.push_back({wi,wj}); for (int e=0; e<nn; e++) if (msk&(1<<e)) { a[wi][wj]=e+1; inc(wi,wj); if (rec()) return true; dec(wi,wj); } break; } } if (tot==ntot) return true; rev(v); return false; } int main() { for (i=0; i<(1<<25); i++) b[i]=b[i/2]+(i&1); scanf("%d",&n); nn=n*n; ntot=nn*nn; for (i=0; i<nn; i++) r[i]=c[i]=(1<<nn)-1; for (i=0; i<n; i++) for (j=0; j<n; j++) s[i][j]=(1<<nn)-1; for (i=0; i<nn; i++) for (j=0; j<nn; j++) { scanf("%d",&a[i][j]); if (a[i][j]!=0) inc(i,j); } rec(); for (i=0; i<nn; i++) for (j=0; j<nn; j++) printf("%d%c",a[i][j],(j+1==nn)?'\n':' '); return 0; }