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";
}