import java.util.*;
public class Solution {
private static void dfsTopoSort(List<List<Integer>> adj, int node, boolean[] visited, List<Integer> result) {
visited[node] = true;
for (int neighbor : adj.get(node)) {
if (!visited[neighbor]) {
dfsTopoSort(adj, neighbor, visited, result);
}
}
result.add(node);
}
public static List<Integer> topoSort(int V, int[][] edges) {
List<List<Integer>> adj = new ArrayList<>();
for (int i = 0; i < V; i++) {
adj.add(new ArrayList<>());
}
for (int[] edge : edges) {
adj.get(edge[0]).add(edge[1]);
}
boolean[] visited = new boolean[V];
List<Integer> result = new ArrayList<>();
for (int i = 0; i < V; i++) {
if (!visited[i]) {
dfsTopoSort(adj, i, visited, result);
}
}
Collections.reverse(result);
return result;
}
}