#include <bits/stdc++.h>
#include "keys.h"
using namespace std;
class DisjointUnionSets {
vector<int> rank, parent;
public:
DisjointUnionSets(int n){
rank.resize(n, 1);
parent.resize(n);
for (int i=0; i<n; i++){
parent[i]=i;
}
}
int find(int i){
int root=parent[i];
if (parent[root]!=root){
return parent[i]=find(root);
}
return root;
}
int func(int i){
int root=find(i);
return rank[root];
}
void unionSets(int x, int y){
int xRoot=find(x);
int yRoot=find(y);
if (xRoot==yRoot) return;
if (rank[xRoot]<rank[yRoot]){
parent[xRoot]=yRoot;
rank[yRoot]+=rank[xRoot];
}
else if (rank[yRoot]<rank[xRoot]){
parent[yRoot]=xRoot;
rank[xRoot]+=rank[yRoot];
}
else{
parent[yRoot]=xRoot;
rank[xRoot]+=rank[yRoot];
}
}
};
vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c){
int n=r.size();
int m=u.size();
DisjointUnionSets dus(n);
for (int i=0; i<m; i++){
if (c[i]==0){
//adj[u[i]].push_back(v[i]);
//adj[v[i]].push_back(u[i]);
dus.unionSets(u[i],v[i]);
}
}
int mn = INT_MAX;
for (int i=0; i<n; i++){
mn=min(mn,dus.func(i));
}
vector <int> ans(n,0);
for (int i=0; i<n; i++){
if (mn!=dus.func(i)){
ans[i]=1;
}
}
return ans;
}