#include <iostream>
#include <vector>
#include <queue>
using namespace std;
vector<vector<bool>> adj;
vector<vector<int>> adj2;
vector<int> vis;
vector<int> s;
int n, m;
int dfs(int st, int target){
vector<int> prev(n, -1);
queue<int> q;
q.push(st);
while(!q.empty()){
int i = q.front();
q.pop();
vis[i] = 1;
if(i == target){
while(i != -1){
cout<<i+1<<' ';
i = prev[i];
}
return 1;
}
for(auto c : adj2[i]){
if(vis[c]) continue;
if(i == st && c == target) continue;
vis[c] = 1;
prev[c] = i;
q.push(c);
}
}
return 0;
}
int main(void){
// freopen("input.txt", "r", stdin);
cin>>n>>m;
adj.assign(n, vector<bool>(n, 0));
vector<pair<int, int>> edges (m, pair<int, int> {0, 0});
adj2.assign(n, {});
for(int i = 0; i<m; i++){
int a, b; cin>>a>>b;
a--, b--;
edges[i] = {a, b};
adj[a][b] = 1;
adj[b][a] = 1;
adj2[a].push_back(b);
adj2[b].push_back(a);
}
for(auto e:edges){
vis.assign(n, 0);
int l = -1, r = -1;
for(int i = 0; i<n; i++){
if(i == e.first || i == e.second) continue;
if(adj[e.first][i] == 1 && adj[e.second][i] == 1) vis[i] = 1;
}
if(dfs(e.first, e.second)) return 0;
}
cout<<"no"<<endl;
return 0;
}