#include "islands.h"
#include <bits/stdc++.h>
#include <variant>
#include <vector>
using namespace std;
class dsu {
public:
vector<int> p;
int n;
dsu(int _n) : n(_n) {
p.resize(n);
iota(p.begin(), p.end(), 0);
}
int get(int x) {
if (p[x] == x) {
return x;
}
return (p[x] = get(p[x]));
}
bool unite(int x, int y) {
x = get(x);
y = get(y);
if (x != y) {
p[y] = x;
return true;
}
return false;
}
};
variant<bool, vector<int>> find_journey(int n, int m, vector<int> u, vector<int> v) {
vector<vector<int>> g(n);
for (int i = 0; i < m; i += 2) {
g[u[i]].push_back(v[i]);
}
bool cyc = false;
vector<bool> vis(n);
auto Dfs = [&](auto&& self, int v) -> void {
vis[v] = true;
for (int u : g[v]) {
if (!vis[u]) {
self(self, u);
}
}
};
Dfs(Dfs, 0);
vector<vector<int>> gg(n);
for (int i = 0; i < m; i++) {
if (vis[u[i]] && vis[v[i]]) {
gg[u[i]].push_back(v[i]);
}
}
vector<int> ts;
vector<int> indeg(n);
queue<int> que;
for (int i = 0; i < n; i++) {
for (int u : gg[i]) {
++indeg[u];
}
}
for (int i = 0; i < n; i++) {
if (indeg[i] != 0) {
que.push(i);
ts.push_back(i);
}
}
while (!que.empty()) {
int v = que.front();
que.pop();
for (int u : gg[v]) {
if (--indeg[u] == 0) {
que.push(u);
ts.push_back(u);
}
}
}
return (ts.size() != n);
}