class Solution { /** Idea: normal DFS, only addition is to add node in stack after completing each path traversal*/ public ArrayList topoSort(int V, int[][] edges) { ArrayList res = new ArrayList<>(); ArrayList> adj = new ArrayList<>(); for(int i=0; i()); } for(int[] edge : edges) { int u = edge[0]; int v = edge[1]; adj.get(u).add(v); } Stack st = new Stack<>(); boolean[] visited = new boolean[V]; for(int i=0; i> adj, boolean[] visited, int node, Stack st) { visited[node] = true; // traverse all neighbours for(int v : adj.get(node)) { if(visited[v] == false) { dfs(adj, visited, v, st); } } st.push(node); } }