#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:10000000000")
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
template <typename T>
ostream& operator<<(ostream& o, vector<T> x) {
  for (auto it : x) o << it << ' ';
  return o;
}
template <typename T>
istream& operator>>(istream& i, vector<T>& x) {
  for (auto& it : x) i >> it;
  return i;
}
template <typename T1, typename T2>
void chkmin(T1& a, T2 b) {
  a > b ? a = b : 0;
}
template <typename T1, typename T2>
void chkmax(T1& a, T2 b) {
  a < b ? a = b : 0;
}
const long long INF = 1000000007;
const long long INF2 = 100000000000000007;
const long long mINF = 1e16;
const long long MOD1 = 998244353;
const long long MOD = 1000000007;
const long long SIZE = 200010;
const long long base = 53;
const long double eps = 1e-6;
const long double pi = acosl(-1.0);
long long add(long long a, long long b) { return ((a + b) % MOD + MOD) % MOD; }
long long mult(long long a, long long b) {
  return ((a % MOD) * (b % MOD)) % MOD;
}
long long binpow(long long a, long long n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = mult(res, a);
    a = mult(a, a);
    n >>= 1;
  }
  return res;
}
long long binpow1(long long a, long long n) {
  long long res = 1;
  while (n) {
    if (n & 1) {
      res *= a;
    }
    a *= a;
    n >>= 1;
  }
  return res;
}
long long inv(long long a) { return binpow(a, MOD - 2); }
long long del(long long a, long long b) { return mult(a, inv(b)); }
long long gcd(long long a, long long b) { return (b == 0 ? a : gcd(b, a % b)); }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
template <typename T>
T sqr(T x) {
  return x * x;
}
long long q, n, m, k, v, v1, deg[SIZE], deg1[SIZE];
vector<long long> g[SIZE];
bool ok;
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> q;
  while (q--) {
    cin >> n >> m >> k;
    for (long long i = 0; i < n; ++i) {
      g[i].clear();
      deg[i] = 0;
    }
    for (long long i = 0; i < m; ++i) {
      cin >> v >> v1;
      v--;
      v1--;
      deg[v]++;
      deg[v1]++;
      g[v].push_back(v1);
      g[v1].push_back(v);
    }
    set<pair<long long, long long> > verts;
    for (long long i = 0; i < n; ++i)
      verts.insert(make_pair(deg[i], i)), sort(g[i].begin(), g[i].end());
    while (!verts.empty() && verts.begin()->first < k - 1) {
      v = verts.begin()->second;
      for (auto& i : g[v]) {
        if (deg[i] > 0) {
          verts.erase(make_pair(deg[i], i));
          deg[i]--;
          if (deg[i] > 0) verts.insert(make_pair(deg[i], i));
        }
      }
      verts.erase(make_pair(deg[v], v));
      deg[v] = 0;
    }
    ok = 1;
    if (verts.size() == k) {
      for (auto& i : verts) {
        ok &= (i.first == k - 1);
      }
      if (ok) {
        cout << 2 << endl;
        for (auto& i : verts) {
          cout << i.second + 1 << ' ';
        }
        cout << endl;
      }
    } else if (verts.size() > k) {
      set<pair<long long, long long> > verts1(verts);
      for (long long i = 0; i < n; ++i) deg1[i] = deg[i];
      while (!verts1.empty()) {
        v = verts1.begin()->second;
        vector<long long> adj_to_v;
        for (long long& i : g[v]) {
          if (deg1[i] > 0) adj_to_v.push_back(i);
        }
        if (deg1[v] == k - 1) {
          ok = 1;
          for (long long i = 0; i < k - 1; ++i) {
            for (long long j = i + 1; j < k - 1; ++j) {
              auto it = lower_bound(g[adj_to_v[i]].begin(),
                                    g[adj_to_v[i]].end(), adj_to_v[j]);
              if (it == g[adj_to_v[i]].end() || *it != adj_to_v[j]) {
                ok = 0;
                break;
              }
            }
            if (!ok) break;
          }
          if (ok) {
            cout << 2 << endl;
            cout << v + 1 << ' ';
            for (long long& i : adj_to_v) cout << i + 1 << ' ';
            cout << endl;
            break;
          }
        }
        ok = 0;
        for (long long& i : adj_to_v) {
          verts1.erase(make_pair(deg1[i], i));
          deg1[i]--;
          if (deg1[i] > 0) verts1.insert(make_pair(deg1[i], i));
        }
        verts1.erase(make_pair(deg1[v], v));
        deg1[v] = 0;
      }
    } else
      ok = 0;
    if (ok) continue;
    while (!verts.empty() && verts.begin()->first < k) {
      v = verts.begin()->second;
      for (auto& i : g[v]) {
        if (deg[i] > 0) {
          verts.erase(make_pair(deg[i], i));
          deg[i]--;
          if (deg[i] > 0) verts.insert(make_pair(deg[i], i));
        }
      }
      verts.erase(make_pair(deg[v], v));
      deg[v] = 0;
    }
    if (!verts.empty()) {
      cout << 1 << endl;
      cout << verts.size() << endl;
      for (auto& it : verts) cout << it.second + 1 << ' ';
      cout << endl;
      continue;
    } else
      cout << "-1\n";
  }
  return 0;
}
