#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005
#define ins insert
vector<int> grub[N];
int cev[N][N];
int dolu[N];
int father[N],sze[N];
int dsu(int x){
if(father[x]==x)return x;
return father[x]=dsu(father[x]);
}
void kardes(int x,int y){
x=dsu(x);y=dsu(y);
if(x==y)return;
cev[x][y]=1;
cev[y][x]=1;
//adj[x].pb(y);
//adj[y].pb(x);
if(sze[x]<sze[y])swap(x,y);
sze[x]+=sze[y];
father[y]=x;
}
void build(vector<vector<int>> _b);
int construct(vector<vector<int>> p) {
int n=p.size();
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++)cev[i][j]=0;
dolu[i]=0;
grub[i].clear();
father[i]=i;
sze[i]=1;
}
//clearlari yap
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(p[i][j]==1)kardes(i,j);
if(p[i][j]==3)return 0;
}
}
for(int i=0;i<n;i++){
grub[dsu(i)].pb(i);
for(int j=0;j<n;j++){
if(dsu(i)==dsu(j)&&p[i][j]!=1)return 0;
}
}
for(int k=0;k<n;k++){
if(dsu(k)!=k)continue;
if(dolu[k])continue;
for(auto u:grub[k]){
dolu[u]=1;
}
set<int> iki;
for(int j=0;j<n;j++){
if(p[k][j]==2)iki.ins(dsu(j));
}
if(iki.size()==0)continue;
if(iki.size()==1)return 0;
vector<vector<int>> grublar;
set<int> hepsi,var;
for(int i=0;i<n;i++){
hepsi.ins(i);
}
grublar.pb(grub[k]);
for(auto u:iki)grublar.pb(grub[u]);
for(int a=0;a<grublar.size();a++){
for(int b=a+1;b<grublar.size();b++){
for(auto u:grublar[a]){
for(auto uu:grublar[b]){
if(p[uu][u]!=2)return 0;
if(hepsi.find(u)!=hepsi.end())hepsi.erase(u);
if(hepsi.find(uu)!=hepsi.end())hepsi.erase(uu);
var.ins(u);
var.ins(uu);
}
}
}
}
set<int> norm;
for(auto u:grub[k])norm.ins(u);
for(auto u:var){
dolu[u]=1;
//cout<<u<<" ";
for(auto uu:hepsi){
if(p[u][uu]!=0)return 0;
}
}
iki.ins(k);
vector<int> v;
for(auto u:iki)v.pb(u);
int m=v.size();
for(int i=0;i<m;i++){
cev[v[i]][v[(i+1+m)%m]]=1;
cev[v[(i+1+m)%m]][v[i]]=1;
}
}
vector<vector<int>> answer;
for(int i=0;i<n;i++){
vector<int> row;
for(int j=0;j<n;j++){
row.pb(cev[i][j]);
}
//cout<<endl;
answer.pb(row);
}
build(answer);
return 1;
}