#include <queue>
using namespace std;
const int N = 1<<19;
vector<pair<int, int>> nei[N];
int pres[N], seen[N];
vector<int> vec[N];
vector<int> find_reachable(vector<int> r, vector<int> U, vector<int> V, vector<int> c){
int n = r.size(), m = c.size();
for (int i=0;i<m;i++){
nei[U[i]].push_back({V[i], c[i]});
nei[V[i]].push_back({U[i], c[i]});
}
vector<int> ans1, ans2(n, 0);
for (int i=0, mn = n + 1, sz;i<n;i++){
vector<int> vC, vV;
queue<int> Q;
Q.push(i), seen[i] = 1, sz = 0;
while (Q.size() > 0){
int u = Q.front();
Q.pop();
pres[r[u]] = 1, sz++;
vV.push_back(u);
vC.push_back(r[u]);
while (vec[r[u]].size() > 0){
if (!seen[vec[r[u]].back()])
Q.push(vec[r[u]].back()), seen[vec[r[u]].back()] = 1;
vec[r[u]].pop_back();
}
for (auto [v, cl] : nei[u]){
if (pres[cl] and !seen[v])
Q.push(v), seen[v] = 1;
else if (!pres[cl])
vec[cl].push_back(v);
vC.push_back(cl);
}
}
if (sz < mn)
mn = sz, ans1.clear();
if (sz == mn)
ans1.push_back(i);
for (int j : vV)
seen[j] = 0;
for (int j : vC)
pres[j] = 0, vec[j].clear();
}
for (int i : ans1)
ans2[i] = 1;
return ans2;
}