← Home
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fast                          \
    ios_base::sync_with_stdio(false); \
    cin.tie(NULL);                    \
    cout.tie(NULL);
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
 
template <class T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template <typename T, typename R>
using omap = tree<T, R, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
 
#define all(x) x.begin(), x.end()
#define clr(x, val) memset(x, val, sizeof(x))
#define F first
#define S second
#define setpr(x) cout << setprecision(x) << fixed
 
const int N = 2e5 + 10;
const int mod = 1e9 + 7;
const ll inf = INT_MAX;
const ld pi = acos(-1.0);
 
#define print(a)          \
    for (auto x : a)      \
        cout << x << " "; \
    cout << endl
#define print1(a)    \
    for (auto x : a) \
        cout << x.first << " " << x.second << endl;
 
#define bug(...) __f(#__VA_ARGS__, __VA_ARGS__)
template <typename Arg1>
void __f(const char *name, Arg1 &&arg1) { cout << name << " : " << arg1 << endl; }
template <typename Arg1, typename... Args>
void __f(const char *names, Arg1 &&arg1, Args &&...args)
{
    const char *comma = strchr(names + 1, ',');
    cout.write(names, comma - names) << " : " << arg1 << " | ";
    __f(comma + 1, args...);
}
vector<vector<ll>> cnt(20);
void pre()
{
    for (int k = 1; k < 20; k++)
    {
        for (int i = 1; i < (1 << k); i++)
        {
            ll now = 0;
            for (int j = 1; j <= k; j++)
            {
                if (i & (1 << (j - 1)))
                {
                    for (int a = j; a <= k; a += j)
                    {
                        now ^= (1 << (a - 1));
                    }
                }
            }
            if (__builtin_popcount(now) <= k / 5)
            {
                cnt[k].push_back(i);
            }
        }
    }
}
void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> jabe(n);
    for (int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        u--;
        v--;
        jabe[u] |= (1 << v);
    }
    if (n >= 20)
    {
        cout << n << endl;
        for (int i = 1; i <= n; i++)
        {
            cout << i << " ";
        }
        cout << endl;
        return;
    }
 
    for (auto it : cnt[n])
    {
        int flag = 1;
        for (int i = 0; i < n; i++)
        {
            if (it & (1 << i))
            {
                if ((it & jabe[i]) != jabe[i])
                {
                    flag = 0;
                    break;
                }
            }
        }
        if (flag)
        {
            vector<int> press;
            for (int i = 0; i < n; i++)
            {
                if (it & (1 << i))
                {
                    press.push_back(i + 1);
                }
            }
            cout << press.size() << endl;
            print(press);
            return;
        }
    }
    cout << -1 << endl;
}
 
int main()
{
    fast;
    // #ifndef ONLINE_JUDGE
    //     freopen("input.txt", "r", stdin);
    //     freopen("output.txt", "w", stdout);
    // #endif
 
    clock_t z = clock();
    int t = 1, cs = 0;
    pre();
    cin >> t;
    while (t--)
    {
        cs++;
        // cout << "Case " << cs << ": ";
        solve();
    }
    // cerr << "Run Time : " << ((double)(clock() - z) / CLOCKS_PER_SEC);
    return 0;
}