#include <bits/stdc++.h>   using namespace std;      #define ll long long   #define pi pair<int, int>   #define pll pair<long long, long long>   #define vi vector<int>   #define vll vector<long long>   #define vpi vector<pair<int, int>>   #define vvi vector<vector<int>>   #define mii map<int, int>   #define mmii multimap<int, int>   #define umii unordered_map<int, int>   #define umsii unordered_multimap<int, int>   #define si set<int>   #define msi multiset<int>   #define usi unordered_set<int>   #define umsi unordered_multiset<int>   #define sc set<char>      #define f(i, s, e) for (long long int i = s; i < e; i++)   #define cf(i, s, e) for (long long int i = s; i <= e; i++)   #define rf(i, e, s) for (long long int i = e - 1; i >= s; i--)   #define pb push_back   #define mp make_pair   #define eb emplace_back   #define F first   #define S second   #define all(x) x.begin(), x.end()   #define rall(x) x.rbegin(), x.rend()      template <class T>   void print_v(vector<T> &v) {       cout <<  [ ;       for (auto x : v) cout << x <<  ,  ;       cout <<   b b] n ;   }      template <class T>   long long int sum_v(vector<T> &v) {       long long int ans = 0;       for (auto a : v) ans += a;       return ans;   }      #define MOD 1000000007   #define PI 3.1415926535897932384626433832795   ll min(ll a, int b) {       if (a < b) return a;       return b;   }   ll min(int a, ll b) {       if (a < b) return a;       return b;   }   ll max(ll a, int b) {       if (a > b) return a;       return b;   }   ll max(int a, ll b) {       if (a > b) return a;       return b;   }   ll gcd(ll a, ll b) {       if (b == 0) return a;       return gcd(b, a % b);   }   ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }   string to_upper(string a) {       for (int i = 0; i < (int)a.size(); ++i)           if (a[i] >=  a  && a[i] <=  z ) a[i] -=  a  -  A ;       return a;   }   string to_lower(string a) {       for (int i = 0; i < (int)a.size(); ++i)           if (a[i] >=  A  && a[i] <=  Z ) a[i] +=  a  -  A ;       return a;   }   bool prime(ll a) {       if (a == 1) return 0;       for (int i = 2; i <= round(sqrt(a)); ++i)           if (a % i == 0) return 0;       return 1;   }   void yes() { cout <<  YES n ; }   void no() { cout <<  NO n ; }      typedef long int int32;   typedef unsigned long int uint32;   typedef long long int int64;   typedef unsigned long long int uint64;      void dfs(vvi &graph, vi &ans, si &visited, int node) {       if (ans[node] == -1 || ans[node] == 2) return;       if (visited.count(node)) {           vi stack;           vi tempvisited(graph.size());           stack.push_back(node);           while (!stack.empty()) {               int val = stack.back();               stack.pop_back();               ans[val] = -1;               tempvisited[val] = 1;               for (int i : graph[val]) {                   if (!tempvisited[i]) stack.push_back(i);               }           }           return;       }       visited.insert(node);       if (ans[node] != -1) ans[node] = min(ans[node] + 1, 2);       for (int i : graph[node]) {           dfs(graph, ans, visited, i);       }       visited.erase(node);   }      void solve() {       int n, m;       cin >> n >> m;       vvi graph(n + 1);       vi ans(n + 1);       si visited;       f(i, 0, m) {           int a, b;           cin >> a >> b;           graph[a].push_back(b);       }       dfs(graph, ans, visited, 1);       cf(i, 1, n) cout << ans[i] <<    ;       cout <<   n ;   }      int main() {       ios_base::sync_with_stdio(false);       cin.tie(NULL);       int t;       cin >> t;       while (t--) {           solve();       }   }