#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int mxV = 1e5 + 1, mxE = 1e6 + 1;
struct E
{
int v, next;
} e[mxE];
int head[mxV], cnt = 0;
inline void add(int u, int v)
{
cnt++;
e[cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
}
bool vis[mxV];
void dfs(int nd)
{
cout << nd << " ";
vector<int> tmp;
for (int i = head[nd]; i; i = e[i].next)
{
if (!vis[e[i].v])
{
vis[e[i].v] = true;
tmp.push_back(e[i].v);
}
}
sort(tmp.begin(), tmp.begin() + tmp.size());
for (int i = 0; i < tmp.size(); ++i)
{
dfs(tmp[i]);
}
}
int que[mxV], q1 = 0, q2 = -1;
void bfs(int nd)
{
cout << nd << " ";
vector<int> tmp;
for (int i = head[nd]; i; i = e[i].next)
{
if (!vis[e[i].v])
{
tmp.push_back(e[i].v);
vis[e[i].v] = true;
}
}
sort(tmp.begin(), tmp.begin() + tmp.size());
for (int i = 0; i < tmp.size(); ++i)
{
q2++;
que[q2] = tmp[i];
}
while (q1 <= q2)
{
q1++;
bfs(que[q1 - 1]);
}
}
int n, m;
int x, y;
int main()
{
cin >> n >> m;
for (int i = 0; i < m; ++i)
{
cin >> x >> y;
add(x, y);
}
vis[1] = true;
dfs(1);
cout << endl;
for (int i = 1; i <= n; ++i)
{
vis[i] = false;
}
vis[1] = true;
bfs(1);
return 0;
}