#include <iostream>
#include <vector>
#include <stack>
using namespace std;
vector <int> *Graf;
vector <int> *Trans;
stack <int> topSort;
int *count;
struct vert{
int number;
bool f_visit;
bool s_visit;
};
vert *Vert;
void dfs(int start){
Vert[start].f_visit = 1;
for(int i = 0; i < (int)Graf[start].size(); i++){
if(Vert[Graf[start][i]].f_visit == 0){
dfs(Graf[start][i]);
}
}
topSort.push(start);
}
void allDFS(int n){
for(int i = 1 ; i <= n; i++){
count[i] = 0;
if(!Vert[i].f_visit){
dfs(i);
}
}
}
void sss(int start, int number){
Vert[start].s_visit = true;
Vert[start].number = number;
count[number]++;
for(int i = 0; i < (int)Trans[start].size(); i++){
if(Vert[Trans[start][i]].s_visit == false){
sss(Trans[start][i], number);
}
}
}
void allSSS(int n){
int number = 1;
while(!topSort.empty()){
if(Vert[topSort.top()].s_visit == false){
sss(topSort.top(), number++);
}
topSort.pop();
}
}
void readDATA(int n, int m){
for(int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
if(c == 0){
Graf[b].push_back(a);
Graf[a + n].push_back(b + n);
Trans[a].push_back(b);
Trans[b + n].push_back(a + n);
}else{
Graf[b].push_back(a + n);
Graf[a + n].push_back(b);
Trans[b].push_back(a + n);
Trans[a + n].push_back(b);
}
}
}
void declareSTRUCTURE(int n){
Vert = new vert[2 * n + 1];
Graf = new vector<int>[2 * n + 1];
Trans = new vector<int>[2 * n + 1];
count = new int[2 * n + 1];
for(int i = 1; i <= 2 * n; i++){
Vert[i].number = 0;
Vert[i].f_visit = false;
Vert[i].s_visit = false;
}
}
void deleteSTRUCTURE(int n){
delete [] Vert;
delete [] Graf;
delete [] Trans;
delete [] count;
}
void printRESULT(int n){
for(int i = 1; i <= n / 2; i++){
if(Vert[i].number == Vert[i + n / 2].number)
count[Vert[i].number]--;
}
for(int i = 1; i <= n / 2; i++)
cout << max(count[Vert[i].number] - 1, 0) << " ";
cout << endl;
}
int main(){
ios_base::sync_with_stdio(false);
int z;
cin >> z;
while(z--){
int n, m;
cin >> n >> m;
declareSTRUCTURE(n);
readDATA(n, m);
allDFS(2 * n);
allSSS(2 * n);
printRESULT(2 * n);
deleteSTRUCTURE(n);
}
return 0;
}
{"html5":"htmlmixed","css":"css","javascript":"javascript","php":"php","python":"python","ruby":"ruby","lua":"text\/x-lua","bash":"text\/x-sh","go":"go","c":"text\/x-csrc","cpp":"text\/x-c++src","diff":"diff","latex":"stex","sql":"sql","xml":"xml","apl":"apl","asterisk":"asterisk","c_loadrunner":"text\/x-csrc","c_mac":"text\/x-csrc","coffeescript":"text\/x-coffeescript","csharp":"text\/x-csharp","d":"d","ecmascript":"javascript","erlang":"erlang","groovy":"text\/x-groovy","haskell":"text\/x-haskell","haxe":"text\/x-haxe","html4strict":"htmlmixed","java":"text\/x-java","java5":"text\/x-java","jquery":"javascript","mirc":"mirc","mysql":"sql","ocaml":"text\/x-ocaml","pascal":"text\/x-pascal","perl":"perl","perl6":"perl","plsql":"sql","properties":"text\/x-properties","q":"text\/x-q","scala":"scala","scheme":"text\/x-scheme","tcl":"text\/x-tcl","vb":"text\/x-vb","verilog":"text\/x-verilog","yaml":"text\/x-yaml","z80":"text\/x-z80"}