#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005
vector<int> grub[N];
int cev[N][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;
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++){
father[i]=i;
sze[i]=1;
grub[i].clear();
}
for (int i = 0; i < n; i++) {
int iki=0,bir=0;
for(int j=0;j<n;j++){
cev[i][j]=0;
if(p[i][j])kardes(i,j);
}
}
for (int i = 0; i < n; i++) {
for(int j=0;j<n;j++){
if(p[i][j]==0&&dsu(i)==dsu(j))return 0;
if(p[i][j]&&dsu(i)!=dsu(j))return 0;
}
grub[dsu(i)].pb(i);
}
for(int k=0;k<n;k++){
if(dsu(k)!=k)continue;
int once=-1;
int m=grub[k].size();
if(m<=1)continue;
if(m==2)return 0;
for(auto u:grub[k]){
for(auto uu:grub[k]){
if(uu==u)continue;
if(p[u][uu]!=2)return 0;
}
}
for(int i=0;i<m;i++){
cev[grub[k][i]][grub[k][((i-1+m)%m)]]=1;
cev[grub[k][((i-1+m)%m)]][grub[k][i]]=1;
cev[grub[k][i]][grub[k][((i+1+m)%m)]]=1;
cev[grub[k][((i+1+m)%m)]][grub[k][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]);
}
answer.pb(row);
}
build(answer);
return 1;
}