/*
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx,avx2,fma")
*/
#include<bits/stdc++.h>
using namespace std;


#ifndef ONLINE_JUDGE
  #include "prettyprint.hpp"
#else 
#define dbg(...)
#endif
 
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
*/
 
#define ar array 
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define sz(v) int((v).size())
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define rep(i,a,b) for(int i = a; i < b; i++)
#define deb(x) cout << #x << "=" << x << endl
#define PI 3.1415926535897932384626
#define PQ(type) priority_queue<type>
#define PQD(type) priority_queue<type,vector<type>,greater<type> >
#define runtime() ((double)clock() / CLOCKS_PER_SEC)
#define endl '\n'
 
//typedef tree<int,null_type,less<int>,rb_tree_tag, tree_order_statistics_node_update> indexed_set; // use less_equal for multiset
// order_of_key (val): returns the no. of values less than val
// find_by_order (k): returns the iterator to kth largest element.(0-based)
 
typedef long long ll; 
typedef long double ld; 
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
 
 
const  int mxN = 1e5+5;
const  long long INF= 1e18;
const long long mod= 998244353;

mt19937 RNG(chrono::steady_clock::now().time_since_epoch().count());
#define SHUF(v) shuffle(all(v), RNG);
// Use mt19937_64 for 64 bit random numbers.



void solve() {  
  int n, m;
  cin >> n >> m;

  vi vis(n + 1), instack(n + 1);

  vector<vi> adj(n + 1);

  rep(i, 0, m) {
    int a, b;
    cin >> a >> b;
    adj[a].pb(b);
  }

  vi group_a(n + 1), group_b(n + 1), ans(n + 1);

  function<void(int, int, int val)> dfs = [&] (int u, int mode, int val) -> void {
    vis[u] = 1;
    ans[u] = val;
    instack[u] = 1;
    for(auto x: adj[u]) {
      if(mode && vis[x]) {
        if(instack[x]) group_a[x] = 1;
        else group_b[x] = 1;
      }      
      if(!vis[x]) dfs(x, mode, val);
    }
    instack[u] = 0;
  };

  dfs(1, -1, 1);
  rep(i, 1, n + 1) vis[i] = 0;
  rep(i, 1, n + 1) {
    if(group_b[i] && !vis[i]) dfs(i, 0, 2);
  }
  rep(i, 1, n + 1) vis[i] = 0;
  rep(i, 1, n + 1) {
    if(group_a[i] && !vis[i]) dfs(i, 0, -1);
  }
  
  rep(i, 1, n + 1) cout << ans[i] << " ";
  cout << endl;

}

int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);

int t = 1;
cin >> t;
while(t--) {
solve();
}
}

