#include <bits/stdc++.h>
namespace FastIO {
bool IOerror = 0;
inline char nc() {
  static char buf[100000], *p1 = buf + 100000, *pend = buf + 100000;
  if (p1 == pend) {
    p1 = buf;
    pend = buf + fread(buf, 1, 100000, stdin);
    if (pend == p1) {
      IOerror = 1;
      return -1;
    }
  }
  return *p1++;
}
inline bool blank(char ch) {
  return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
template <class T>
inline bool read(T& x) {
  bool sign = 0;
  char ch = nc();
  x = 0;
  for (; blank(ch); ch = nc())
    ;
  if (IOerror) return false;
  if (ch == '-') sign = 1, ch = nc();
  for (; ch >= '0' && ch <= '9'; ch = nc()) x = x * 10 + ch - '0';
  if (sign) x = -x;
  return true;
}
template <class T, class... U>
bool read(T& h, U&... t) {
  return read(h) && read(t...);
}
};  // namespace FastIO
using namespace std;
using namespace FastIO;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int INF = 0x3f3f3f3f;
const int N = 1e5 + 10;
int deg[N], vis[N];
vector<int> e[N];
int main() {
  int T;
  read(T);
  while (T--) {
    int n, m, k;
    read(n, m, k);
    for (int i = 1; i <= n; i++) e[i].clear(), vis[i] = 0;
    for (int i = 1; i <= m; i++) {
      int u, v;
      read(u, v);
      e[u].push_back(v);
      e[v].push_back(u);
    }
    queue<int> q;
    vector<int> clique;
    for (int i = 1; i <= n; i++) {
      deg[i] = (e[i]).size();
      sort((e[i]).begin(), (e[i]).end());
      if (deg[i] < k) {
        vis[i] = 1;
        q.push(i);
      }
    }
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      vis[u] = 2;
      if (1LL * k * (k - 1) / 2 <= 1LL * m && deg[u] == k - 1 &&
          clique.empty()) {
        int ok = 1;
        clique.push_back(u);
        for (auto v : e[u])
          if (vis[v] != 2) clique.push_back(v);
        for (auto x : clique) {
          if (!ok) break;
          for (auto y : clique) {
            if (x != y && !binary_search((e[x]).begin(), (e[x]).end(), y)) {
              ok = 0;
              break;
            }
          }
        }
        if (!ok) clique.clear();
      }
      for (auto v : e[u]) {
        --deg[v];
        if (deg[v] < k && !vis[v]) {
          q.push(v);
          vis[v] = 1;
        }
      }
    }
    int cnt = 0;
    for (int i = 1; i <= n; i++)
      if (!vis[i]) cnt++;
    if (cnt) {
      printf("1 %d\n", cnt);
      for (int i = 1; i <= n; i++)
        if (!vis[i]) printf("%d ", i);
      puts("");
    } else if (!clique.empty()) {
      puts("2");
      for (int i = 0; i < k; i++) printf("%d ", clique[i]);
      puts("");
    } else {
      puts("-1");
    }
  }
  return 0;
}
