#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
const int N = 1e5 + 5;
int n, m;
set<int> G[N];
int vis[N];
int deg(int u) {
return G[u].size();
}
struct Node {
int a, u, b;
};
int nxt[N];
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("POLYGON.inp")) {
freopen("POLYGON.inp", "r", stdin);
freopen("POLYGON.out", "w", stdout);
}
cin >> n >> m;
if (n <= 3) return cout << "1 2 3", 0;
for (int i = 1; i <= n + m; i++) {
int u, v; cin >> u >> v;
if (u == v) continue;
G[u].insert(v);
G[v].insert(u);
}
vector<Node> ops;
int sz = n;
queue<int> Q;
for (int i = 1; i <= n; i++) if (deg(i) == 2) Q.push(i);
while(sz > 3) {
while (!Q.empty() && (vis[Q.front()] || deg(Q.front()) != 2)) Q.pop();
int u = Q.front(); Q.pop();
if (vis[u]) continue;
int a = *G[u].begin(), b = *G[u].rbegin();
ops.push_back({a, u, b});
G[a].erase(u); G[b].erase(u);
G[u].clear();
vis[u] = 1; sz--;
if (!G[a].count(b)) {
G[a].insert(b);
G[b].insert(a);
}
if (deg(a) == 2) Q.push(a);
if (deg(b) == 2) Q.push(b);
}
vector<int> rem;
rem.reserve(3);
for (int i = 1; i <= n; ++i) if (!vis[i]) rem.push_back(i);
for (int i = 0; i < 3; i++) {
nxt[rem[i]] = rem[(i + 1) % 3];
}
for (int t = (int)ops.size() - 1; t >= 0; t--) {
int a = ops[t].a, u = ops[t].u, b = ops[t].b;
if (nxt[a] == b) {
nxt[a] = u;
nxt[u] = b;
}
else {
nxt[b] = u;
nxt[u] = a;
}
}
vector<int> ans;
for (int i = 0, cur = 1; i < n; i++) ans.push_back(cur), cur = nxt[cur];
if (ans[1] > ans.back()) {
reverse(ans.begin(), ans.end());
cout << "1 ";
for (int i: ans) if (i != 1) cout << i << " ";
}
else for (int i: ans) cout << i << " ";
return 0;
}
/*
Vì đề kêu là cho các đường chéo của đa giác và các đường chéo không cách nhau
nên luôn tồn tại >= 1 đỉnh chỉ có 2 cạnh
Giả sử đó là đỉnh u
và đỉnh u chỉ có 2 cạnh u - a và u-b
Lưu lại cặp cạnh u - a và u - b
Sau đó xóa đỉnh u và tạo cạnh mới a - b
Tiếp tục đa giác mới luôn tồn tại đỉnh u' chỉ có 2 cạnh
Lặp lại bước trên đến khi nào đa giác mới chỉ còn 3 đỉnh thì ngưng lại
Giờ thì đảo ngược lại quá trình trên để xây lại đa giác ban đầu
Đa giác hiện tại của ta giả sử có 3 cạnh X-Y, Y-Z, Z-X
Nếu có cạnh X-u và u-Y thì thêm vào và xóa cạnh cũ X-Y, tạo ra đa giác mới X-u, u-Y, Y-Z, Z-X;
Tương tự vậy đến hết là xong
vậy là được đa giác chỉ có các cạnh bao quanh (k có cạnh chéo)
muốn có được thứ tự nhỏ nhất thì bắt đầu từ 1 và đi theo đỉnh hàng xóm nào có thứ tự nhỏ nhất là được
*/