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;
}