func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( Ofast )   #pragma GCC optimize( unroll-loops )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native )   using namespace std;   long long MOD = 1000000007;   long double EPS = 1e-9;   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   int getRand(int l, int r) {     uniform_int_distribution<int> uid(l, r);     return uid(rng);   }   long long binpow(long long b, long long p, long long mod) {     long long ans = 1;     b %= mod;     for (; p; p >>= 1) {       if (p & 1) ans = ans * b % mod;       b = b * b % mod;     }     return ans;   }   void pre() {}   struct UnionFind {     int n, set_size, *parent, *rank;     UnionFind() {}     UnionFind(int a) {       n = set_size = a;       parent = new int[n + 1];       rank = new int[n + 1];       for (int i = 1; i <= n; ++i) parent[i] = i, rank[i] = 1;     }     int find(int x) {       if (x != parent[x]) return parent[x] = find(parent[x]);       return x;     }     void merge(int x, int y) {       int xroot = find(x), yroot = find(y);       if (xroot != yroot) {         if (rank[xroot] >= rank[yroot]) {           parent[yroot] = xroot;           rank[xroot] += rank[yroot];         } else {           parent[xroot] = yroot;           rank[yroot] += rank[xroot];         }         set_size -= 1;       }     }     void reset() {       set_size = n;       for (int i = 1; i <= n; i++) parent[i] = i, rank[i] = 1;     }     int size() { return set_size; }     void print() {       for (int i = 1; i <= n; ++i) cout << i <<   ->   << parent[i] <<   n ;     }   } uf(300300);   int n, m, k;   map<pair<int, int>, int> blocked;   set<int> unvisited;   void dfs(int tt) {     vector<long long> deleter;     for (auto v : unvisited) {       if (blocked.find(make_pair(tt, v)) == blocked.end()) {         deleter.emplace_back(v);         uf.merge(tt, v);       }     }     for (auto v : deleter) {       unvisited.erase(v);     }     for (auto v : deleter) {       dfs(v);     }   }   void solve() {     int n, m, k, kk;     cin >> n >> m >> kk;     k = kk;     int onedeg = n - 1;     for (long long i = 1; i <= m; ++i) {       int u, v;       cin >> u >> v;       blocked[make_pair(u, v)] = 1;       blocked[make_pair(v, u)] = 1;       if (u == 1 || v == 1) onedeg--;     }     for (long long i = 2; i <= n; ++i) {       unvisited.insert(i);     }     int cmp = 0;     while (!unvisited.empty()) {       int stt = *(unvisited.begin());       unvisited.erase(stt);       dfs(stt);     }     for (long long i = 2; i <= n; ++i) {       if (k && uf.find(1) != uf.find(i) &&           blocked.find(make_pair(1, i)) == blocked.end()) {         k--;         uf.merge(1, i);       }     }     bool pos = 1;     for (long long i = 2; i <= n; ++i) {       if (uf.find(1) != uf.find(i)) pos = 0;     }     if (pos && onedeg >= kk)       cout <<  possible n ;     else       cout <<  impossible n ;   }   signed main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     pre();     long long t = 1;     for (long long i = 1; i <= t; i++) {       solve();     }   }   