多路径
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;
int read()
{
int x=0;
char ch=getchar();
while(ch<'0' || ch>'9')ch=getchar();
while(ch<='9' && ch>='0')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x;
}
vector<int> G[400005];
vector<int> cnt;
unordered_map<int,int> mp;
int num[400005];
int ans[400005];
void inital(int n)
{
for(int i=1;i<=n;i++)
{
G[i].clear();
ans[i]=0;
num[i]=0;
}
cnt.clear();
mp.clear();
return ;
}
void find_loop(int v)
{
if(mp[v]==1)
{
int size=cnt.size();
for(int i=size-1;i>=0;i--)
{
if(num[cnt[i]]==-1)
{
mp[v]=1;
cnt.push_back(v);
return ;
}
num[cnt[i]]=-1;
if(cnt[i]==v)
{
mp[v]=1;
cnt.push_back(v);
return ;
}
}
}
mp[v]=1;
cnt.push_back(v);
for(auto it=G[v].begin();it!=G[v].end();it++)
{
find_loop(*it);
}
cnt.pop_back();
mp[v]=0;
}
void DFS(int v)
{
for(auto it=G[v].begin();it!=G[v].end();it++)
{
bool flag=0;
if(ans[*it]<=1 && ans[*it]>=0)
{
flag=1;
}
if(num[*it]==-1)
ans[*it]=-1;
else if(ans[v]==-1)
ans[*it]=-1;
else if(ans[*it]>=0)
ans[*it]+=ans[v];
if(flag)
{
DFS(*it);
}
}
}
int main()
{
int t;
t=read();
while(t--)
{
int n,m;
n=read();
m=read();
inital(n);
for(int i=0;i<m;i++)
{
int x,y;
x=read();
y=read();
G[x].push_back(y);
}
find_loop(1);
ans[1]++;
DFS(1);
for(int i=1;i<=n;i++)
{
if(ans[i]>=2)
cout<<2<<' ';
else
cout<<ans[i]<<' ';
}
cout<<'\n';
}
return 0;
}