#include <bits/stdc++.h>
using namespace std;
class graph {
 public:
  int n, m, k;
  set<pair<int, int>> s;
  vector<unordered_set<int>> vec;
  void init() {
    cin >> n >> m >> k;
    s.clear();
    vec.resize(n);
    for (int i = 0; i < m; i++) {
      int u, v;
      cin >> u >> v;
      vec[u - 1].insert(v - 1);
      vec[v - 1].insert(u - 1);
    }
    for (int i = 0; i < n; i++) {
      s.insert({vec[i].size(), i});
    }
  }
  bool cheak(int ind) {
    vector<int> tmp(vec[ind].begin(), vec[ind].end());
    for (int i = 0; i < tmp.size(); i++) {
      for (int j = i + 1; j < tmp.size(); j++) {
        if (!vec[tmp[i]].count(tmp[j])) return false;
      }
    }
    return true;
  }
  void del(int ind) {
    for (auto i : vec[ind]) {
      s.erase({vec[i].size(), i});
      vec[i].erase(ind);
      s.insert({vec[i].size(), i});
    }
    vec[ind].clear();
    m--;
  }
  void solve() {
    init();
    while (s.size()) {
      int num = s.begin()->first;
      int vertex = s.begin()->second;
      if (num >= k) {
        cout << 1 << ' ' << s.size() << '\n';
        for (auto i : s) cout << i.second + 1 << ' ';
        cout << '\n';
        return;
      }
      if (num == k - 1 && cheak(vertex)) {
        cout << 2 << '\n' << vertex + 1 << ' ';
        for (auto i : vec[vertex]) cout << i + 1 << ' ';
        cout << '\n';
        return;
      }
      s.erase(s.begin());
      del(vertex);
    }
    cout << -1 << '\n';
  }
};
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  int t;
  cin >> t;
  while (t--) {
    graph g;
    g.solve();
  }
}
