#include <iostream>
#include <stack>
using namespace std;
const long MAXN = 5010;
typedef struct
{
long Num;
long Used;
long Alive;
long Low;
long belong;
void init(long pos)
{
Num=Used=Alive=Low=0;
belong=pos;
}
}Node;
long N,M;
long p[MAXN];
long In[MAXN];
Node vec[MAXN];
long Permit;
stack <long> s;
bool hash[MAXN];
typedef struct
{
long v, next;
}Edge;
Edge e[MAXN*30];
inline void init()
{
while (!s.empty())
{
s.pop();
}
long i;
Permit=0;
memset(hash, 0, sizeof(hash));
memset(p,-1,sizeof(p));
memset(In,0,sizeof(In));
for (i=1;i<=N;++i)
{
vec[i].init(i);
}
for (i=0;i<M;++i)
{
long from,to;
scanf("%ld %ld",&from,&to);
e[i].next=p[from];
e[i].v=to;
p[from]=i;
}
}
inline void update(long &a,long b)
{
if(a>b) a=b;
}
inline void dfs(long pos)
{
s.push(pos);
vec[pos].Low=vec[pos].Num=++Permit;
vec[pos].Used=vec[pos].Alive=true;
long j;
for (j=p[pos];j!=-1;j=e[j].next)
{
long to=e[j].v;
if (vec[to].Used)
{
if (vec[to].Alive)
{
update(vec[pos].Low,vec[to].Num);
}
}
else
{
dfs(to);
update(vec[pos].Low,vec[to].Low);
}
}
if (vec[pos].Num==vec[pos].Low)
{
long t;
while ((t=s.top())!=pos)
{
vec[t].belong=pos;
vec[t].Alive=false;
s.pop();
}
vec[pos].belong=pos;
vec[pos].Alive=false;
s.pop();
}
}
inline void Tarjan()
{
long i;
for (i=1;i<=N;++i)
{
if (!vec[i].Used)
{
dfs(i);
}
}
}
void solution()
{
long i, j;
for (i = 1; i <= N; ++i)
{
if (!hash[vec[i].belong])
{
for (j = p[i]; j != -1; j = e[j].next)
{
if (vec[i].belong != vec[e[j].v].belong)
{
hash[vec[i].belong] = true;
}
}
}
}
bool flag = false;
for (i = 1; i <= N; ++i)
{
if (!hash[vec[i].belong])
{
if (flag)
{
printf(" ");
}
printf("%ld", i);
flag = true;
}
}
printf("\n");
}
int main()
{
while (scanf("%ld", &N) != EOF && N)
{
scanf("%ld", &M);
init();
Tarjan();
solution();
}
return 0;
}