rt
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define gc() getchar()
inline int read()
{
int x = 0;
char ch = gc();
while (!isdigit(ch)) ch = gc();
while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
return x;
}
const int N = 500005;
int n, m, ans[N], cnt, f[N], tmp;
int head[N], nxt[N << 1], vel[N << 1], tot;
bool flag, rings[N], trc, vis[N];
struct Point
{
int x, y;
}a[N << 1];
bool cmp(Point M1, Point M2)
{
return M1.y > M2.y;
}
void add(int x, int y)
{
nxt[++tot] = head[x];
head[x] = tot;
vel[tot] = y;
}
void dfs1(int x)
{
vis[x] = 1;
ans[++cnt] = x;
for (int i = head[x]; i; i = nxt[i])
{
int y = vel[i];
if (!vis[y])
dfs1(y);
}
}
void dfsRing(int x, int fa)
{
if (flag)
return;
if (!f[x])
{
f[x] = fa;
}
else if (f[x] != fa)
{
while (fa != x)
rings[fa] = 1, fa = f[fa];
rings[x] = 1, flag = 1;
return;
}
for (int i = head[x]; i; i = nxt[i])
{
int y = vel[i];
if (y != fa)
dfsRing(y, x);
}
}
void dfs(int x)
{
ans[++cnt] = x;
vis[x] = 1;
if (!rings[x])
{
for (int i = head[x]; i; i = nxt[i])
{
int y = vel[i];
if (vis[y])
continue;
dfs(y);
}
return;
}
bool fl = 0;
for (int i = head[x]; i; i = nxt[i])
{
if (trc)
break;
int y = vel[i];
if (vis[y])
continue;
if (rings[y])
{
i = nxt[i];
while (vis[vel[i]])
i = nxt[i];
if (i)
tmp = vel[i];
else if (y > tmp)
trc = fl = 1;
break;
}
}
for (int i = head[x]; i; i = nxt[i])
{
int y = vel[i];
if (vis[y])
continue;
if (rings[y] && fl)
continue;
dfs(y);
}
}
int main()
{
n = read(), m = read();
for (int i = 1; i <= m; i++)
{
int u = read(), v = read();
a[i].x = a[i + m].y = u;
a[i].y = a[i + m].x = v;
}
sort (a + 1, a + 1 + m + m, cmp);
for (int i = 1; i <= m + m; i++)
add(a[i].x, a[i].y);
if (m == n - 1)
{
dfs1 (1);
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
return 0;
}
dfsRing(1, 0);
tmp = 0x3f3f3f3f;
dfs(1);
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
return 0;
}