#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
const int N = 1e6 + 10;
int n, m, h[N], e[N], ne[N], idx;
bool st[N] = {false};
struct edge{
int x, y;
};
edge edges[N];
bool compare(edge &a, edge &b){
if(a.x == b.x) return a.y > b.y;
return a.x > b.x;
}
void add(int a, int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
void dfs(int x){
printf("%d ", x);
st[x] = true;
for (int i = h[x]; ~i; i = ne[i]){
if(!st[e[i]]) dfs(e[i]);
}
}
void bfs(int x){
queue<int> q;
q.push(x);
st[x] = true;
while(q.size()){
int t = q.front();
q.pop();
printf("%d ", t);
for (int i = h[t]; !i; i = ne[i]){
if(!st[e[i]]){
st[e[i]] = true;
q.push(e[i]);
}
}
}
}
int main(){
memset(h, -1, sizeof h);
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) scanf("%d%d", &edges[i].x, &edges[i].y);
sort(edges + 1, edges + 1 + m, compare);
for (int i = 1; i <= m; i++) add(edges[i].x, edges[i].y);
for (int i = 1; i <= n; i++){
if(!st[i]) dfs(i);
}
printf("\n");
memset(st, false, sizeof st);
for (int i = 1; i <= n; i++){
if(!st[i]) bfs(i);
}
return 0;
}