#include <bits/stdc++.h>
using namespace std;
template <typename T>
ostream &operator<<(ostream &os, const vector<T> &v) {
  os << '{';
  string sep;
  for (const auto &x : v) os << sep << x, sep = ", ";
  return os << '}';
}
template <typename T, size_t size>
ostream &operator<<(ostream &os, const array<T, size> &arr) {
  os << '{';
  string sep;
  for (const auto &x : arr) os << sep << x, sep = ", ";
  return os << '}';
}
template <typename A, typename B>
ostream &operator<<(ostream &os, const pair<A, B> &p) {
  return os << '(' << p.first << ", " << p.second << ')';
}
void dbg_out() { cerr << endl; }
template <typename Head, typename... Tail>
void dbg_out(Head H, Tail... T) {
  cerr << ' ' << H;
  dbg_out(T...);
}
auto random_address = [] {
  char *p = new char;
  delete p;
  return (uint64_t)p;
};
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count() *
               (random_address() | 1));
template <typename T>
void output_vector(const vector<T> &v, bool add_one = false, int start = -1,
                   int end = -1) {
  if (start < 0) start = 0;
  if (end < 0) end = int(v.size());
  for (int i = start; i < end; i++)
    cout << v[i] + (add_one ? 1 : 0) << (i < end - 1 ? ' ' : '\n');
}
const int ATTEMPTS = 50;
int N, M;
vector<vector<int>> adj;
vector<int> tour_index;
vector<array<int, 2>> low_link;
vector<bool> in_stack;
int tour;
vector<int> tour_list;
array<int, 2> combine(array<int, 2> x, int y) {
  array<int, 3> a = {x[0], x[1], y};
  sort(a.begin(), a.end());
  return {a[0], a[1]};
}
array<int, 2> combine(array<int, 2> x, array<int, 2> y) {
  array<int, 4> a = {x[0], x[1], y[0], y[1]};
  sort(a.begin(), a.end());
  return {a[0], a[1]};
}
bool interesting_dfs(int node) {
  tour_index[node] = tour++;
  tour_list.push_back(node);
  low_link[node] = {tour_index[node], tour_index[node]};
  in_stack[node] = true;
  for (int neighbor : adj[node])
    if (tour_index[neighbor] < 0) {
      if (!interesting_dfs(neighbor)) return false;
      low_link[node] = combine(low_link[node], low_link[neighbor]);
    } else if (in_stack[neighbor]) {
      low_link[node] = combine(low_link[node], tour_index[neighbor]);
    } else {
      return false;
    }
  in_stack[node] = false;
  return true;
}
vector<int> save_interesting;
bool check_interesting(int node) {
  if (save_interesting[node] >= 0) return save_interesting[node];
  tour_index.assign(N, -1);
  low_link.resize(N);
  in_stack.assign(N, false);
  tour = 0;
  tour_list.clear();
  return (save_interesting[node] = interesting_dfs(node));
}
void run_case() {
  cin >> N >> M;
  adj.assign(N, {});
  for (int i = 0; i < M; i++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    adj[u].push_back(v);
  }
  save_interesting.assign(N, -1);
  int root = -1;
  for (int iter = 0; iter < ATTEMPTS; iter++) {
    root = int(rng() % N);
    if (check_interesting(root)) break;
    root = -1;
  }
  if (root < 0) {
    cout << -1 << '\n';
    return;
  }
  vector<bool> bad(N, false);
  for (int x : tour_list)
    if (low_link[x][0] < tour_index[x] && low_link[x][1] < tour_index[x]) {
      bad[x] = true;
    } else {
      assert(low_link[x][1] == tour_index[x]);
      int above = tour_list[low_link[x][0]];
      bad[x] = bad[above];
    }
  vector<int> interesting;
  for (int i = 0; i < N; i++)
    if (!bad[i]) interesting.push_back(i);
  if (5 * int(interesting.size()) < N)
    cout << -1 << '\n';
  else
    output_vector(interesting, true);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  int tests;
  cin >> tests;
  while (tests-- > 0) run_case();
}
