vector<vector<int>> edges; // 邻接矩阵
vector<int> visited;
bool valid;
void dfs(int u) {
visited[u] = 1;
for (auto &v : edges[u]) {
if (visited[v] == 0) {
dfs(v);
if (!valid) {
return;
}
} else if (visited[v] == 1) {
valid = false;
return;
}
}
visited[u] = 2;
}