#include <bits/stdc++.h>
using std::cin;
using std::cout;
const int N = 100054, M = N * 2;
int V, E, K, Es = 0;
int to[M], first[N], next[M];
int deg[N], deg_raw[N];
int que[N];
int len = 0, ans[N];
int stamp = 0, tag[N];
bool alive[N];
std::unordered_set<unsigned long long> S;
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>,
                    std::greater<std::pair<int, int>>>
    pq;
inline void addedge(int u, int v) {
  to[++Es] = v, next[Es] = first[u], first[u] = Es, ++deg[u];
  to[++Es] = u, next[Es] = first[v], first[v] = Es, ++deg[v];
}
inline bool check(int u, int v) {
  return S.count(u < v ? u | (unsigned long long)v << 32
                       : v | (unsigned long long)u << 32);
}
void work() {
  int i, j, u, v, x, y, h, t = 0;
  cin >> V >> E >> K, Es = len = 0;
  memset(deg, 0, (V + 1) << 2);
  memset(first, 0, (V + 1) << 2);
  memset(alive, true, V + 1);
  S.clear();
  for (i = 1; i <= E; ++i) {
    cin >> u >> v, addedge(u, v);
    if (u > v) std::swap(u, v);
    S.emplace(u | (unsigned long long)v << 32);
  }
  if (K == 1) {
    cout << "2\n1\n";
    return;
  }
  memcpy(deg_raw, deg, (V + 1) << 2);
  for (i = 1; i <= V; ++i)
    if (deg[i] < K) que[t++] = i;
  for (h = 0; h < t; ++h) {
    alive[x = que[h]] = false;
    for (i = first[x]; i; i = next[i])
      if (alive[y = to[i]] && --deg[y] == K - 1) que[t++] = y;
  }
  if (t < V) {
    for (i = 1; i <= V; ++i)
      if (alive[i]) ans[len++] = i;
    cout << '1' << ' ' << len << '\n';
    for (i = 0; i < len; ++i) cout << ans[i] << (i == len - 1 ? '\n' : ' ');
    return;
  }
  if (K * (K - 1ll) > 2 * E) {
    cout << "-1\n";
    return;
  }
  memcpy(deg, deg_raw, (V + 1) << 2);
  memset(alive, true, V + 1);
  for (t = 0, i = 1; i <= V; ++i)
    if (deg[i] < K - 1) que[t++] = i;
  for (h = 0; h < t; ++h) {
    alive[x = que[h]] = false;
    for (i = first[x]; i; i = next[i])
      if (alive[y = to[i]] && --deg[y] == K - 2) que[t++] = y;
  }
  if (t <= V - K) {
    for (; !pq.empty(); pq.pop())
      ;
    for (i = 1; i <= V; ++i)
      if (alive[i] && deg[i] < K) pq.emplace(deg[i], i);
    for (; !pq.empty();) {
      std::tie(v, x) = pq.top(), pq.pop();
      if (deg[x] != v) continue;
      alive[x] = false;
      if (deg[x] == K - 1) {
        len = 0, ans[len++] = x;
        for (i = first[x]; i; i = next[i])
          if (alive[y = to[i]]) ans[len++] = y;
        assert(len == K), ++stamp;
        for (i = 0; i < K; ++i)
          if (tag[ans[i]] = stamp, deg[ans[i]] < K - 1) break;
        if (i == K) {
          if (K < 120) {
            for (i = 0; i < K - 1; ++i) {
              for (j = i + 1; j < K; ++j)
                if (!check(ans[i], ans[j])) break;
              if (j < K) break;
            }
          } else {
            int cnt = 0;
            for (i = 1; i <= Es; i += 2)
              if (tag[to[i]] == stamp && tag[to[i + 1]] == stamp) ++cnt;
            i = (cnt == K * (K - 1) / 2 ? K - 1 : -1);
          }
          if (i == K - 1) {
            cout << '2' << '\n';
            for (i = 0; i < len; ++i)
              cout << ans[i] << (i == len - 1 ? '\n' : ' ');
            return;
          }
        }
      }
      for (i = first[x]; i; i = next[i])
        if (alive[y = to[i]] && --deg[y] < K) pq.emplace(deg[y], y);
    }
  }
  cout << "-1\n";
}
int main() {
  int T;
  std::ios::sync_with_stdio(false), cin.tie(NULL);
  for (cin >> T; T; --T) work();
  return 0;
}
