#include #include using namespace std ; const int MAXN = 1000 ; vector>> edges, oedges ; int adj[MAXN][MAXN], oadj[MAXN][MAXN] ; // 0 means this edge is deleted or never existed char aspec[MAXN][MAXN] ; vector visited, ndel, ondel ; vector tin, low, live, olive, isspec ; int n, m, k ; int timer ; void rmedge(int a, int b) { if (adj[a][b] == 0) return ; adj[a][b] = adj[b][a] = 0 ; } void rmnode(int a) { if (ndel[a]) return ; ndel[a] = 1 ; for (auto b: edges[a]) { rmedge(a, b.first) ; if (b.second) rmnode(b.first) ; } } void dfs(int v, int p = -1) { visited[v] = true ; if (ndel[v]) return; tin[v] = low[v] = timer++ ; for (auto b: edges[v]) { int to = b.first ; if (ndel[to] || adj[v][to] == 0 || to == p) continue ; if (visited[to]) { low[v] = min(low[v], tin[to]) ; } else { dfs(to, v) ; low[v] = min(low[v], low[to]) ; if (low[to] > tin[v]) adj[v][to] = adj[to][v] = -1 ; } } } void find_bridges() { timer = 0 ; visited.assign(n, false) ; tin.assign(n, -1) ; low.assign(n, -1) ; for (int i=0; i> ne ; for (auto b: edges[a]) if (adj[a][b.first]) ne.push_back(b) ; swap(edges[a], ne) ; } live.clear() ; for (int a=0; a 1) live.push_back(a) ; return live.size() ; } int main() { cin >> n >> m >> k ; isspec.resize(n) ; edges.resize(n) ; visited.resize(n) ; tin.resize(n) ; low.resize(n) ; for (int i=0; i> a >> b ; int s = (i < k) ; a-- ; b-- ; edges[a].push_back({b,s}) ; edges[b].push_back({a,s}) ; adj[a][b] = adj[b][a] = 1 ; if (s) { isspec[a]++ ; isspec[b]++ ; aspec[a][b] = aspec[b][a] = 1 ; } } ndel.resize(n) ; for (int a=0; a 2) rmnode(a) ; for (int a=0; a sol ; sol.push_back(a) ; sol.push_back(b) ; while (1) { int c = -1 ; for (int i=0; i<(int)edges[b].size(); i++) if (visited[edges[b][i].first] != 2) c = edges[b][i].first ; if (c < 0) break ; sol.push_back(c) ; visited[c] = 2 ; a = b ; b = c ; } for (auto a: sol) cout << " " << 1+a ; cout << endl ; }