#include #define f(i, s, k, l) for (int i = s; i < k; i += l) #define for0(i, k) f(i, 0, k, 1) #define pl pair #define pb push_back #define vl vector #define vi vector #define sz(x) (ll)(x).size() using namespace std; using ll = long long; using ld = double; void getPath(vl &trip, vector &adj, vl &parent, ll v) { ll cur = v; while (parent[cur] != cur) { trip.pb(cur); cur = parent[cur]; } trip.pb(cur); } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); ll n, m, u, v; cin >> n >> m; vector adj(n); for0(i, m) { cin >> u >> v; u--; v--; adj[u].pb(v); adj[v].pb(u); } vl dist(n, 1e9); vl parent(n, -1); dist[0] = 0; parent[0] = 0; ll res = 1e9, v1 = -1, v2 = -1; queue q; q.push(0); while (!q.empty()) { ll cur = q.front(); q.pop(); for (ll neigh : adj[cur]) { if (parent[neigh] == -1) { q.push(neigh); parent[neigh] = cur; dist[neigh] = cur + 1; } else if (neigh == parent[cur]) continue; else if (dist[neigh] + 1 + dist[cur] < res) { res = dist[neigh] + 1 + dist[cur]; v1 = cur; v2 = neigh; } } } if (v1 == -1) { cout << "impossible" << endl; return 0; } vl trip; getPath(trip, adj, parent, v1); reverse(trip.begin(), trip.end()); getPath(trip, adj, parent, v2); cout << sz(trip) << endl; for (ll x : trip) cout << x + 1 << endl; }