#include #include #include #include #define rep(i, n) for (int i = 0; i < n; i++) #define all(x) begin(x), end(x) #define sz(x) ssize(x) using namespace std; using vi = vector; using vvi = vector; int main() { cin.tie(0)->sync_with_stdio(0); std::mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int n, m, k; cin >> n >> m >> k; vvi adj(n); vi deg(n); rep(i, m) { int u, v; cin >> u >> v; u--, v--; adj[u].push_back(v), adj[v].push_back(u); deg[u]++, deg[v]++; } double error = 0.0001; int samples = min(3000, static_cast(log(error) / log(1 - pow(4, -k)))); rep(_, samples) { vector green(n); rep(i, n) if (deg[i] <= k) green[i] = rng() % 2; vector vis(n); vvi components; rep(i, n) if (green[i] && !vis[i]) { vector component = {i}; vis[i] = true; rep(j, sz(component)) for (int v : adj[component[j]]) if (green[v] && !vis[v]) { component.push_back(v); vis[v] = true; } components.push_back(component); } vi edges(sz(components)); rep(i, sz(components)) for (int u : components[i]) for (int v : adj[u]) edges[i] += !green[v] || (u < v); vector dp(sz(components) + 1, vector(k + 1, false)); dp[0][0] = true; rep(i, sz(components)) rep(j, k + 1) { dp[i+1][j] |= dp[i][j]; if (j + edges[i] <= k) dp[i+1][j+edges[i]] |= dp[i][j]; } if (!dp.back().back()) continue; vi ans; for (int i = sz(components), j = k; i > 0 && j > 0; i--) if (dp[i][j] && !dp[i-1][j]) { ans.insert(ans.end(), all(components[i-1])); j -= edges[i-1]; } cout << sz(ans) << "\n"; rep(i, sz(ans)) cout << ans[i] + 1 << " \n"[i == sz(ans) - 1]; return 0; } cout << "impossible\n"; return 0; }