1function tarjanSCC(n, edges) {
2 const dfn = Array(n).fill(0), low = Array(n).fill(0);
3 const stack = [], inStack = Array(n).fill(false);
4 let ts = 0; const sccs = [];
5 function dfs(u) {
6 dfn[u] = low[u] = ++ts;
7 stack.push(u); inStack[u] = true;
8 for (const v of adj[u]) {
9 if (!dfn[v]) { dfs(v); low[u] = Math.min(low[u], low[v]); }
10 else if (inStack[v]) low[u] = Math.min(low[u], dfn[v]);
11 }
12 if (dfn[u] === low[u]) {
13 const scc = []; let v;
14 do { v = stack.pop(); inStack[v] = false; scc.push(v); } while (v !== u);
15 sccs.push(scc);
16 }
17 }
18 for (let i = 0; i < n; i++) if (!dfn[i]) dfs(i);
19 return sccs;
20}