// Problem: G. How Many Paths?
// Contest: Codeforces - Codeforces Round #731 (Div. 3)
// URL: https://codeforces.com/contest/1547/problem/G
// Memory Limit: 512 MB
// Time Limit: 4000 ms
// Author:  UpMing
//
// Powered by CP Editor (https://cpeditor.org)

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include <algorithm>
#include <cctype>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef unsigned long long ull;

const long long INF = 1e18;
const int maxn = 4e5 + 7;
const ll mod = 1e9 + 7;

#define pb push_back
#define debug(x) cout << #x << ":" << x << endl;
#define mst(x, a) memset(x, a, sizeof(x))
#define rep(i, a, b) for (int i = (a); i <= (b); ++i)
#define dep(i, a, b) for (int i = (a); i >= (b); --i)

inline ll read() {
    ll x = 0;
    bool f = 0;
    char ch = getchar();
    while (ch < '0' || '9' < ch)
        f |= ch == '-', ch = getchar();
    while ('0' <= ch && ch <= '9')
        x = x * 10 + ch - '0', ch = getchar();
    return f ? -x : x;
}

void out(ll x) {
    int stackk[20];
    if (x < 0) {
        putchar('-');
        x = -x;
    }
    if (!x) {
        putchar('0');
        return;
    }
    int top = 0;
    while (x)
        stackk[++top] = x % 10, x /= 10;
    while (top)
        putchar(stackk[top--] + '0');
}
ll qpow(ll a, ll b) {
    ll ans = 1;
    while (b) {
        if (b & 1)
            ans = ans * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return ans;
}
ll n, m, in[maxn], f[maxn],tpd[maxn];
vector<ll> e[maxn];
ll ans[maxn], dist[maxn];
void bfs() {
    queue<int> q;
    dist[1] = 1;
    q.push(1);
    while (q.size()) {
        int u = q.front();
        q.pop();
        for (int v : e[u]) {
            if (dist[v] == 0) {
                dist[v] = 1;
                q.push(v);
            }
        }
    }
}

void top_sort() {
	rep(i,1,n) ans[i] = dist[i];
	for(int i=1 ;i<=n;i++)
	{
		if(ans[i])
		{
			for(int j:e[i])
			{
				in[j]++;
			}
		}
	}
	queue<int>q;
	for(int i=1 ;i<=n ;i++) if(ans[i]&&in[i]==0) q.push(i),f[i] = 1;
	while(q.size())
	{
		int u = q.front();
		q.pop();
		tpd[u] = 1;
		for(int v:e[u])
		{
			in[v]--;
			f[v]+=f[u];
			f[v] = min(f[v],INF);
			if(in[v]==0) q.push(v);
		}
	}

	rep(i,1,n)
	{
		if(ans[i]){
			
			 if(tpd[i]==0) ans[i] =-1;
			 else if(f[i]>=2) ans[i] =2 ;
			//. else ans[i] = 1;
		}
	}
	
	rep(i,1,n)cout<<ans[i]<<" ";
	cout<<endl;
}

int main() {
    // ios::sync_with_stdio(false);
    int _ = read();
    while (_--) {
        n = read(), m = read();
        rep(i, 1, n) e[i].clear(),tpd[i] =  dist[i] = ans[i] = f[i] = in[i] = 0;
		
        rep(i, 1, m) {
            ll u, v;
            u = read(), v = read();
            e[u].pb(v);
        }
        bfs();
        top_sort();
    }
    return 0;
}
/*


*/
