#include <bits/stdc++.h>

using namespace std;

struct nodS
{
    int viz;
    bool dublu, inf;
    vector<int> v;
};

int n,m,t,i;
nodS nod[400005];

void dfs(int p)
{
    nod[p].viz=1;
    for(int it : nod[p].v)
    {
        if(!nod[it].viz)
            dfs(it);
        else if(nod[it].viz==1)
            nod[it].inf=true;
        else
            nod[it].dublu=true;
    }
    nod[p].viz=2;
}
void pushInf(int p)
{
    nod[p].inf=true;

    for(int it : nod[p].v)
        if(!nod[it].inf)
            pushInf(it);
}
void pushDublu(int p)
{
    nod[p].dublu=true;

    for(int it : nod[p].v)
        if(!nod[it].dublu)
            pushDublu(it);
}

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

    cin>>t;
    while(t)
    {
        t--;
        cin>>n>>m;

        for(i=1;i<=n;i++)
        {
            nod[i].v.clear();
            nod[i].viz=0;
            nod[i].dublu=false;
            nod[i].inf=false;
        }

        for(i=1;i<=m;i++)
        {
            int x, y;
            cin>>x>>y;
            nod[x].v.push_back(y);
        }

        dfs(1);

        for(i=1;i<=n;i++)
        {
            if(!nod[i].viz)
                continue;

            if(nod[i].inf)
                pushInf(i);
            if(nod[i].dublu)
                pushDublu(i);
        }

        for(i=1;i<=n;i++)
        {
            if(!nod[i].viz)
                cout<<0;
            else if(nod[i].inf)
                cout<<-1;
            else if(nod[i].dublu)
                cout<<2;
            else
                cout<<1;

            cout<<' ';
        }
        cout<<'\n';
    }
    return 0;
}
