#include <bits/stdc++.h>   using namespace std;   long long int gcd(long long int a, long long int b) {     return (b == 0LL ? a : gcd(b, a % b));   }   long double dist(long double x, long double arayikhalatyan, long double x2,                    long double y2) {     return sqrt((x - x2) * (x - x2) +                 (arayikhalatyan - y2) * (arayikhalatyan - y2));   }   long long int S(long long int a) { return (a * (a + 1LL)) / 2LL; }   mt19937 rnd(363542);   char vow[] = { a ,  e ,  i ,  o ,  u };   int dx[] = {0, -1, 0, 1, -1, -1, 1, 1, 0};   int dy[] = {-1, 0, 1, 0, -1, 1, -1, 1, 0};   const int N = 5e5 + 30;   const long long int mod = 998244353;   const long double pi = acos(-1);   const long double e = 1e-13;   long long int bp(long long int a, long long int b = mod - 2LL) {     long long int ret = 1;     while (b) {       if (b & 1) ret *= a, ret %= mod;       a *= a;       a %= mod;       b >>= 1;     }     return ret;   }   ostream& operator<<(ostream& c, pair<int, int> a) {     c << a.first <<     << a.second;     return c;   }   struct pt {     long long int x, y;     int ind;     int bl;     bool operator==(const pt& a) { return ind == a.ind; }     bool operator<(const pt& b) {       if (x == b.x) return y < b.y;       return x < b.x;     }   };   int n, m, t, k;   vector<int> g[N];   int sz[N];   unordered_map<int, int> mp[N];   bool stg(int v) {     vector<int> fp;     for (int p : g[v])       if (sz[p] >= k - 1) fp.push_back(p);     for (int i = 0; i < fp.size(); i++)       for (int j = i + 1; j < fp.size(); j++)         if (!mp[fp[i]][fp[j]]) return 0;     return 1;   }   void cl() {     for (int i = 1; i <= n; i++) {       mp[i].clear();       g[i].clear();       sz[i] = 0;     }   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     ;     cin >> t;     while (t--) {       cin >> n >> m >> k;       for (int i = 0; i < m; i++) {         int a, b;         cin >> a >> b;         mp[a][b] = 1;         mp[b][a] = 1;         g[a].push_back(b);         g[b].push_back(a);       }       if (k > 500) {         cout << -1 << endl;         cl();         continue;       }       queue<int> q, q1;       for (int i = 1; i <= n; i++) {         sz[i] = g[i].size();         if (sz[i] < k) q.push(i);       }       int qn = n;       while (q.size()) {         int v = q.front();         qn--;         sz[v] = 0;         q.pop();         for (auto p : g[v]) {           sz[p]--;           if (sz[p] == k - 1) q.push(p);         }       }       if (qn) {         cout << 1 <<     << qn << endl;         for (int i = 1; i <= n; i++)           if (sz[i] >= k) cout << i <<    ;         cl();         cout <<   n ;         continue;       }       for (int i = 1; i <= n; i++) {         sz[i] = g[i].size();         if (sz[i] < k - 1)           q.push(i);         else if (sz[i] == k - 1)           q1.push(i);       }       bool bl = 0;       while ((int)q.size() + (int)q1.size()) {         if (q.size()) {           int v = q.front();           sz[v] = 0;           q.pop();           for (auto p : g[v]) {             sz[p]--;             if (sz[p] == k - 1)               q1.push(p);             else if (sz[p] == k - 2)               q.push(p);           }         } else {           int v = q1.front();           q1.pop();           if (sz[v] < k - 1) {             continue;           }           if (stg(v)) {             cout << 2 << endl;             cout << v <<    ;             for (int p : g[v])               if (sz[p] >= k - 1) cout << p <<    ;             cout <<   n ;             bl = 1;             break;           }           q.push(v);         }       }       if (!bl) cout << -1 << endl;       cl();     }     return 0;   }