package tu;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingQueue;
public class Test {
static int max_n=99999;
static int[] inDegree = new int[max_n];
static Map<String,ArrayList<Integer>> map;//map中保存着list数组,list数组中保存着这个顶点的后继元素们
public static int tpsort(int n)
{
Queue<Integer> qi = new LinkedBlockingQueue<Integer>();
int num=0;
for(int i=1;i<=n;i++)//首先把入度为0的点入队
{
if(inDegree[i] ==0)
qi.add(i);
}
while(qi.size()>0)
{
int v = qi.poll();
num++;
System.out.print(v+" ");
for(int s : map.get("list"+v))//清楚以该顶点为弧尾的边
{
inDegree[s]--;
if(inDegree[s]==0)
{
qi.add(s);
}
}
}
return num;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
map = new HashMap<String,ArrayList<Integer>>();
for(int i=1;i<=n;i++)//map中保存着list数组,list数组中保存着这个顶点的后继元素们
{
ArrayList<Integer> li = new ArrayList<Integer>();
map.put("list"+i,li);
}
for(int i=1;i<=m;i++)
{
int a = sc.nextInt();
int b = sc.nextInt();
map.get("list"+a).add(b);
inDegree[b]++;
}
tpsort(n);
}
}