Link to this code: https://cses.fi/paste/9e00670c96e8c953ad2968/
#include "bits/stdc++.h"
using namespace std;

int main() {
	int n; cin >> n;
	int m; cin >> m;
	vector<vector<int>> adj(n);
	for (int i = 0, a, b; i < m; ++i) {
		cin >> a >> b;
		--a, --b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}

	vector<bool> vis(n);
	vector<int> par(n);		// parent nel dfs-tree
	// funzione ricorsiva all'interno di una funzione.
	// (assolutamente non necessario.)
	auto dfs = [&](auto&& self, int v) -> void {
		vis[v] = true;
		for (int u : adj[v]) {
			if (u == par[v])
				continue;
			if (vis[u]) {	// ho trovato un back-edge, quindi un ciclo
				vector<int> ans;
				int cur = v;
				while (cur != u) {
					ans.push_back(cur);
					cur = par[cur];
				}
				ans.push_back(u);
				ans.push_back(v);
				cout << ans.size() << "\n";
				for (int i : ans)
					cout << i+1 << " ";
				cout << "\n";
				exit(0);	// termina il programma
			} else {
				par[u] = v;
				self(self, u);
			}
		}
	};
	for (int i = 0; i < n; ++i)
		if (!vis[i])
			dfs(dfs, i);

	cout << "IMPOSSIBLE\n";
}