#include <bits/stdc++.h>
using namespace std;
const double PI = 2 * acos(0.0);
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng_64(chrono::steady_clock::now().time_since_epoch().count());
const string DIGITS = "0123456789";
const string ALPH = "abcdefghijklmnopqrstuvwxyz";
template <class T0, class T1>
inline ostream &operator<<(ostream &out, pair<T0, T1> &a) {
  return out << "{" << a.first << ", " << a.second << "}";
}
template <class T0, class T1>
inline istream &operator>>(istream &in, pair<T0, T1> &a) {
  return in >> a.first >> a.second;
}
template <class T0, class T1, class T2>
inline ostream &operator<<(ostream &out, tuple<T0, T1, T2> &a) {
  return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a)
             << "}";
}
template <class T0, class T1, class T2, class T3>
inline ostream &operator<<(ostream &out, tuple<T0, T1, T2, T3> &a) {
  return out << "{" << get<0>(a) << ", " << get<1>(a) << ", " << get<2>(a)
             << ", " << get<3>(a) << "}";
}
template <class T>
inline ostream &operator<<(ostream &out, vector<T> &a) {
  out << "[";
  for (int i = 0; i < int(a.size()); ++i)
    out << a[i] << vector<string>{", ", "]  "}[i + 1 == a.size()];
  return out;
}
void smain();
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << setprecision(12) << fixed;
  smain();
  return 0;
}
const int N = 1e5 + 100;
int used[N], USED = 0;
set<int> g[N], f[N];
int q[N], st, fn, b[N], par[N], kek[N];
int us[N];
int s;
bool dfs(int v) {
  used[v] = USED;
  for (auto to : g[v]) {
    if (used[to] == USED + 1) {
      return false;
    }
    if (used[to] != USED) {
      if (kek[to] + kek[s] >= 1 || !dfs(to)) return false;
    }
  }
  used[v] = USED + 1;
  return true;
}
void smain() {
  int t, n = 0, m;
  cin >> t;
  while (t--) {
    for (int i = 1; i <= n; i++) {
      g[i].clear();
      f[i].clear();
      us[i] = 0;
      kek[i] = 0;
    }
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
      int a, b;
      cin >> a >> b;
      g[a].insert(b);
      f[b].insert(a);
    }
    int cnt = n / 5 + (n % 5 != 0);
    if (n < 100) {
      vector<int> ans;
      for (int i = 1; i <= n; i++) {
        USED += 2;
        s = i;
        if (dfs(i)) ans.push_back(i);
      }
      if (((int)((ans).size())) >= cnt) {
        for (auto p : ans) {
          cout << p << " ";
        }
        cout << "\n";
      } else {
        cout << "-1\n";
      }
      continue;
    }
    int v = max(1, cnt / 10);
    vector<int> ans;
    bool flag = true;
    for (int i = 0; i < v; i++) {
      int p = 0;
      while (p < 20) {
        int u = rng() % n + 1;
        if (us[u]) continue;
        USED += 2;
        if (dfs(u)) {
          s = u;
          ans.push_back(u);
          us[u] = 2;
          for (auto h : f[u]) {
            g[h].erase(u);
            kek[h]--;
          }
          for (auto h : g[u]) {
            kek[h]++;
          }
        } else {
          us[u] = 1;
        }
        p++;
      }
      if (p == 20) {
        flag = false;
        break;
      }
    }
    if (!flag) {
      cout << "-1\n";
      continue;
    }
    for (int i = 1; i <= n; i++) {
      if (!us[i]) {
        s = i;
        USED += 2;
        if (dfs(i)) ans.push_back(i);
      }
    }
    if (((int)((ans).size())) >= cnt) {
      sort(ans.begin(), ans.end());
      for (auto p : ans) cout << p << " ";
      cout << "\n";
    } else {
      cout << "-1\n";
    }
  }
}
