#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
const int MAXN=200;
int n,m,map[MAXN][MAXN];
int c[MAXN];
int topo[MAXN],t;
bool dfs(int u)
{
c[u]=-1;
for(int v=1;v<=n;v++)
{
if(map[u][v])
{
if(c[v]<0)
{
return false ;
}
else if (!c[v])
{
dfs(v) ;
}
}
}
c[u] = 1 ;
topo[--t] = u ;
return true ;
}
bool toposort()
{
t=n;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
if(!c[i])
{
if(!dfs(i))
{
return false ;
}
}
}
return true ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0) break;
memset(map,0,sizeof(map));
memset(topo,0,sizeof(topo));
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
map[u][v]=1;
}
toposort();
for(int i=0;i<=n-2;i++)
printf("%d ",topo[i]);
printf("%d\n",topo[n-1]);
}
return 0;
}
#include <string.h>
#include <iostream>
using namespace std;
const int MAXN=200;
int n,m,map[MAXN][MAXN];
int c[MAXN];
int topo[MAXN],t;
bool dfs(int u)
{
c[u]=-1;
for(int v=1;v<=n;v++)
{
if(map[u][v])
{
if(c[v]<0)
{
return false ;
}
else if (!c[v])
{
dfs(v) ;
}
}
}
c[u] = 1 ;
topo[--t] = u ;
return true ;
}
bool toposort()
{
t=n;
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
if(!c[i])
{
if(!dfs(i))
{
return false ;
}
}
}
return true ;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(m==0&&n==0) break;
memset(map,0,sizeof(map));
memset(topo,0,sizeof(topo));
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
map[u][v]=1;
}
toposort();
for(int i=0;i<=n-2;i++)
printf("%d ",topo[i]);
printf("%d\n",topo[n-1]);
}
return 0;
}