#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define fi first
#define se second
#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)
#define sp <<' '<<
#define mid (l+r)/2
#define all(x) x.begin(),x.end()
#define carp(a,b) ((a%MOD)*(b%MOD))%MOD
#define topla(a,b) ((a%MOD)+(b%MOD))%MOD
#define pb push_back
#define DEBUG(x) cout<<#x sp x<<endl;
#define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl;
#define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;
typedef vector<bool> vb;
typedef long long ll;
typedef vector<ll> vll;
typedef pair<ll,ll> pll;
const int MAXN=2e5+6;
const int INF=1e9+7;
#include "supertrees.h"
int n;
int r[MAXN], p[MAXN];
vi adj[MAXN];
vector<vi> a;
int find(int a){
while(a!=p[a]) a=p[a];
return a;
}
void uni(int a,int b){
a=find(a);
b=find(b);
if(r[a]>r[b]) swap(a,b);
p[a]=p[b];
if(r[a]==r[b]) r[b]++;
r[a]=r[b];
}
bool vis[MAXN];
int son;
void dfs(int nd){
vis[nd]=true;
son=nd;
FOR(i,n){
if(!vis[i+1] and a[nd-1][i]==2){
if(find(nd)!=find(i+1)){
uni(i+1,nd);
adj[i+1].pb(nd);
adj[nd].pb(i+1);
dfs(i+1);
}
}
}
}
vi vec;
bool mark[MAXN];
void dfs2(int nd,int ata){
vec.pb(nd);
vis[nd]=true;
for(auto kom:adj[nd]){
if(kom==ata or kom==nd) continue;
if(!vis[kom]) dfs2(kom,nd);
else{
while(!vec.empty() and vec.back()!=kom){
mark[vec.back()]=true;
vec.pop_back();
}
if(!vec.empty()){
mark[vec.back()]=true;
vec.pop_back();
}
}
}
if(!vec.empty()) vec.pop_back();
}
int construct(vector<vi> b){
n=b.size();
a=b;
vector<vi> ans(n,vi(n));
FORE(i,1,n+1){
r[i]=0;
p[i]=i;
vis[i]=false;
}
FOR(i,n){
FOR(j,n){
if(a[i][j]==1){
if(find(i+1)!=find(j+1)){
uni(i+1,j+1);
adj[i+1].pb(j+1);
adj[j+1].pb(i+1);
}
}
}
}
FORE(i,1,n+1){
if(!vis[i]){
dfs(i);
adj[son].pb(i);
adj[i].pb(son);
}
}
FORE(i,1,n+1) vis[i]=false;
FORE(i,1,n+1){
if(!vis[i]){
dfs2(i,-1);
}
}
/*FORE(i,1,n+1){
DEBUG(i);
DEBUG(mark[i]);
cont(adj[i]);
}*/
FORE(i,1,n+1){
for(auto kom:adj[i]){
if(i!=kom) ans[i-1][kom-1]=1;
}
}
bool f=true;
FOR(i,n){
FOR(j,n){
//if(i==j) continue;
if(a[i][j]==0){
if(find(i+1)==find(j+1)){
f=false;
break;
}
}
else if(a[i][j]==1){
if(i!=j and (mark[i+1]==true and mark[j+1]==true)){
f=false;
break;
}
}
else{
if(find(i+1)!=find(j+1) or (!mark[i+1] and !mark[j+1])){
f=false;
break;
}
}
//cout<<f<<' ';
}
if(!f) break;
//cout<<endl;
}
if(f){
build(ans);
return 1;
}
return 0;
/*int n = p.size();
vector<vi> answer;
for (int i = 0; i < n; i++) {
vi row;
row.resize(n);
answer.push_back(row);
}
build(answer);
return 1;*/
}