#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
#define dMAX 100000
using namespace std;
int n, m, x, y, poz;
bool viz;
vector<pair<int, bool> > graf[dMAX + 2];
vector<int> muchii;
int d[dMAX + 2];
char sir[30];
int idx;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
void GetInt(int &t) {
t = 0;
while (isdigit(sir[idx])) {
t *= 10;
t += (int)sir[idx] - '0';
idx++;
}
idx++;
}
bool Compare(pair<int, bool> e1, pair<int, bool> e2) {
return e1.first < e2.first;
}
void BinarySearch(int l, int r, int val, int idx, int &p) {
if (l > r) return;
else {
int middle = (l + r) / 2;
if (graf[idx][middle].first == val) {
if (graf[idx][middle].second == false) {
p = middle;
BinarySearch(l, middle - 1, val, idx, p);
} else {
BinarySearch(middle + 1, r, val, idx, p);
}
} else {
if (graf[idx][middle].first > val) {
BinarySearch(l, middle - 1, val, idx, p);
} else BinarySearch(middle + 1, r, val, idx, p);
}
}
}
void Euler(int v) {
int newV, u, l, nn, siz;
siz = graf[v].size();
for (u = 0; u < siz; u++) {
newV = graf[v][u].first;
viz = graf[v][u].second;
if (!viz) {
graf[v][u].second = true;
poz = 0;
BinarySearch(0, siz, v, newV, poz);
graf[newV][poz].second = true;
Euler(newV);
}
}
if (v != 1)
fout << v << ' ';
}
int main()
{
int i, j;
fin >> n >> m;
fin.get();
for (i = 1; i <= m; i++) {
idx = 0;
fin.getline(sir, 30);
GetInt(x);
GetInt(y);
graf[x].push_back({y, 0});
graf[y].push_back({x, 0});
d[x]++, d[y]++;
}
for (i = 1; i <= n; i++) {
sort(graf[i].begin(), graf[i].end(), Compare);
}
fout << "1 ";
Euler(1);
return 0;
}