for (auto& v : G[u]) { if (dfn[v]) { if (inStack.count(v)) low[u] = min(dfn[v], low[u]); continue; }
dfs(v); low[u] = min(low[v], low[u]); }
if (dfn[u] == low[u]) { int tmp; do { tmp = s.top(); s.pop(); inStack.erase(tmp); } while (tmp != u); ++cnt; } }
intmain() { int N, M; while (cin >> N >> M && !(!N && !M)) { // init TIME = 0; cnt = 0; dfn.assign(N + 1, 0); low.assign(N + 1, 0); inStack.clear(); G.assign(N + 1, vector<int>()); while (!s.empty()) s.pop();
while (M--) { int u, v, P; // P 為 1 代表單向 u -> v,為 2 代表雙向 u -> v, v -> u cin >> u >> v >> P;
G[u].push_back(v); if (P == 2) G[v].push_back(u); }
for (int u = 1; u <= N; ++u) if (!dfn[u] && cnt < 2) dfs(u);