#include "supertrees.h"
#include <bits/stdc++.h>
#define pii pair <int, int>
#define tiii tuple <int, int, int>
#define tiiii tuple <int, int, int, int>
#define emb emplace_back
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define iShowSpeed cin.tie(NULL)->sync_with_stdio(false)
#define matrix vector <vector <int>>
#define mat(n, m) vector <vector <int>> (n, vector <int> (m));
using namespace std;
int par[1005], par2[1005];
int dsu(int a){
return par[a] = (a == par[a] ? a : dsu(par[a]));
}
int dsu2(int a){
return par2[a] = (a == par2[a] ? a : dsu2(par2[a]));
}
int construct(std::vector<std::vector<int>> a){
int n = a.size();
iota(par, par + n, 0ll);
iota(par2, par2 + n, 0ll);
vector <vector <int>> ans(n, vector <int> (n));
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 1 && dsu(i) != dsu(j)) par[dsu(i)] = dsu(j), ans[i][j] = ans[j][i] = 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 2) par2[dsu2(i)] = dsu2(j);
if (a[i][j] == 3) return 0;
}
}
vector <int> v[n];
for (int i = 0; i < n; i++) if (dsu(i) == i) v[dsu2(i)].emb(i);
for (int i = 0; i < n; i++) {
int sz = v[i].size();
if (sz == 1) continue;
if (sz == 2) return 0;
for (int j = 0; j < sz; j++) {
ans[v[i][j]][v[i][(j + 1) % sz]] = ans[v[i][(j + 1) % sz]][v[i][j]] = 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 0 && dsu2(dsu(i)) == dsu2(dsu(j))) return 0;
if (a[i][j] == 1 && dsu(i) != dsu(j)) return 0;
if (a[i][j] == 2 && (dsu2(dsu(i)) != dsu2(dsu(j)) || dsu(i) == dsu(j))) return 0;
}
}
build(ans);
return 1;
}