importjava.util.*;publicclassMain{publicstaticvoidmain(String[] args){Scanner sc =newScanner(System.in);int n = sc.nextInt();int m = sc.nextInt();// 记录入度int[] inDegree =newint[n];// 记录文件依赖关系List<List<Integer>> dependRelation =newArrayList<>();for(int i =0; i < n; i++){
dependRelation.add(newArrayList<>());}for(int i =0; i < m; i++){int s = sc.nextInt();int t = sc.nextInt();
inDegree[t]++;// 记录s指向哪些文件,即是哪些文件的前置文件
dependRelation.get(s).add(t);}Queue<Integer> queue =newLinkedList<>();for(int i =0; i < n; i++){if(inDegree[i]==0){// 入度为0的文件,可以作为开头,先加入队列
queue.add(i);}}List<Integer> result =newArrayList<>();// 拓扑排序while(!queue.isEmpty()){int cur = queue.poll();// 当前选中的文件
result.add(cur);for(int file : dependRelation.get(cur)){
inDegree[file]--;// cur的指向的文件入度-1if(inDegree[file]==0){
queue.add(file);}}}// 如果结果集包含的元素个数等于n,说明能成功处理,不然说明存在循环依赖,无法成功处理if(result.size()== n){for(int i =0; i < result.size(); i++){System.out.print(result.get(i));if(i < result.size()-1){System.out.print(" ");}}}else{System.out.println(-1);}}}