public static ArrayList<Integer> topoSort(int V, int[][] edges){
int indegree[] = new int[V];
ArrayList<ArrayList<Integer>> adj = new ArrayList<>();
for(int i = 0; i < V; i++) adj.add(new ArrayList<>());
for (int[] edge : edges) {
int u = edge[0];
int v = edge[1];
adj.get(u).add(v);
indegree[v]++;
}
Queue<Integer> q = new LinkedList<>();
for(int i = 0; i < V; i++) {
if(indegree[i] == 0) q.offer(i);
}
ArrayList<Integer> res = new ArrayList<>();
while(!q.isEmpty()) {
int node = q.poll();
res.add(node);
for(int n: adj.get(node)) {
indegree[n]--;
if(indegree[n] == 0) q.offer(n);
}
}
return res;
}