import java.util.ArrayList; import java.util.Scanner; import java.util.Arrays; import java.util.stream.IntStream; public class Toposort { private static ArrayList toposort(ArrayList[] adj) { boolean[] visited = new boolean[adj.length]; ArrayList order = new ArrayList(); int[] postV = new int[adj.length]; int[] clock = new int[1]; dfs(adj, visited, postV, clock); // https://stackoverflow.com/questions/951848/java-array-sort-quick-way-to-get-a-sorted-list-of-indices-of-an-array/35701049 int[] temp = IntStream.range(0, postV.length).boxed().sorted((i, j) -> postV[i] - postV[j]).mapToInt(ele -> ele).toArray(); Arrays.sort(postV); for (int i = adj.length - 1; i > -1; i--) { order.add(temp[i]); } return order; } private static void dfs(ArrayList[] adj, boolean[] visited, int[] postV, int[] clock) { for (int v = 0; v < adj.length; v++) { if (!visited[v]) explore(v, adj, visited, postV, clock); } } private static void explore(int v, ArrayList[] adj, boolean[] visited, int[] postV, int[] clock) { visited[v] = true; for (int w : adj[v]) { if (!visited[w]) explore(w, adj, visited, postV, clock); } postVisit(v, clock, postV); } private static void postVisit(int v, int[] clock, int[] postV) { postV[v] = clock[0]; clock[0] = clock[0] + 1; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int m = scanner.nextInt(); ArrayList[] adj = (ArrayList[]) new ArrayList[n]; for (int i = 0; i < n; i++) { adj[i] = new ArrayList(); } for (int i = 0; i < m; i++) { int x, y; x = scanner.nextInt(); y = scanner.nextInt(); adj[x - 1].add(y - 1); } ArrayList order = toposort(adj); for (int x : order) { System.out.print((x + 1) + " "); } } }