#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
using ar2 = array<int,2>;
constexpr int MAXN = 5+400000;

namespace kos {
int my_scc[MAXN], sccno = 0, n = -1; // node to scc, sccno = # of scc
vector<int> g[MAXN], rg[MAXN];
stack<int> ts;
bool vis[MAXN];
void dfs(int u, bool revg) {
  vis[u] = true;
  if (revg) my_scc[u] = sccno;
  const auto& gw = (revg ? rg : g);
  for (int v : gw[u]) if (!vis[v]) dfs(v,revg);
  if (!revg) ts.push(u);
}
void solve() {
  fill(vis, vis+n, false);
  for (int u = 0; u < n; ++u) {
    if (!vis[u]) dfs(u,false);
    for (int v : g[u]) rg[v].push_back(u);
  }
  fill(vis, vis+n, false);
  sccno = 0;
  while (!ts.empty()) {
    int u = ts.top();ts.pop();
    if (!vis[u]) dfs(u,true), sccno++;
  }
}}

vector<int> g2[MAXN];
bitset<MAXN> visited1;
bool loop[MAXN], path[MAXN];

void dfs1(int u) {
  visited1[u] = true;
  for (int v : g2[u]) {
    if (!visited1[v]) {
      dfs1(v);
    } else {
      path[v] = true;
    }
  }
}

void dfs2(int u, bool arr[]) {
  arr[u] = true;
  for (int v : g2[u]) {
    if (!arr[v]) {
      dfs2(v, arr);
    }
  }
}

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);
  int tc; cin >> tc;
  while (tc--) {
    using kos::n;
    using kos::g;
    using kos::rg;
    int m; cin >> n >> m;
    for (int i = 0; i < n; ++i) {
      g[i].clear();
      g2[i].clear();
      rg[i].clear();
      loop[i] = path[i] = visited1[i] = false;
    }
    while (m--) {
      int a,b; cin >> a >> b; --a; --b;
      g[a].push_back(b);
    }
    kos::solve();
    for (int u = 0; u < n; ++u) {
      for (int v : g[u]) {
        assert(kos::my_scc[u] <= kos::my_scc[v]);
        g2[kos::my_scc[u]].push_back(kos::my_scc[v]);
        if (kos::my_scc[u] == kos::my_scc[v]) {
          loop[kos::my_scc[u]] = true;
        }
      }
    }
    dfs1(kos::my_scc[0]);
    for (int i = kos::sccno-1; i >= kos::my_scc[0]; --i) {
      if (loop[i]) {
        dfs2(i, loop);
      }
      if (path[i]) {
        dfs2(i, path);
      }
    }
    for (int i = 0; i < n; ++i) {
      if (i > 0) cout << ' ';
      if (!visited1[kos::my_scc[i]]) {
        cout << 0;
      } else if (loop[kos::my_scc[i]]) {
        cout << -1;
      } else if (path[kos::my_scc[i]]) {
        cout << 2;
      } else {
        cout << 1;
      }
    }
    cout << '\n';
  }
  return 0;
}
 
