#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#include<limits.h>
using namespace std;
class dsu
{
public:
vector<int>parent;
vector<pair<int,int>>rank;
dsu(int y)
{
parent.assign(y+1,-1);
rank.assign(y+1,{1,INT_MAX});
}
int find(int x)
{
if(parent[x]==-1) return x;
return parent[x]=find(parent[x]);
}
int unite(int i, int j,int w)
{
int s1=find(i);
int s2=find(j);
if(s1!=s2)
{
if(rank[s1].first>rank[s2].first)
{
parent[s2]=s1;
rank[s1].first+=rank[s2].first;
rank[s1].second=min(rank[s1].second,w);
}
else {
parent[s1]=s2;
rank[s2].first+=rank[s1].first;
rank[s2].second=min(rank[s2].second,w);
}
return 1;
}
return 0;
}
};
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
dsu Dsu(n);
int m;
cin>>m;
priority_queue<vector<int>>edge;
while(m--)
{
int x,y,z;
cin>>x>>y>>z;
edge.push({z,y,x});
}
int ans=0;
while(!edge.empty())
{
auto edg=edge.top();
int dist = edg[0];
int v=edg[1];
int u=edg[2];
edge.pop();
int s1=Dsu.find(u);
int s2=Dsu.find(v);
if(s1!=s2)
{
if(Dsu.rank[s1].second==dist)ans-=Dsu.rank[s1].first;
if(Dsu.rank[s2].second==dist) ans-=Dsu.rank[s2].first;
}
if(Dsu.unite(u,v,dist))
{
ans+=max(Dsu.rank[s1].first,Dsu.rank[s2].first);
}
for(auto it: Dsu.rank)
cout<<it.first<<" "<<it.second<<endl;
cout<<endl;
}
cout<<ans<<endl;
}
/*
2
4 6
1 2 3
2 3 2
4 3 4
1 4 1
2 4 2
1 3 2
8 7
1 2 2
2 3 1
3 4 4
4 5 3
5 6 4
6 7 1
7 8 2
}*/
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0cmluZz4KI2luY2x1ZGU8Y21hdGg+CiNpbmNsdWRlPGFsZ29yaXRobT4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxxdWV1ZT4KI2luY2x1ZGU8bGltaXRzLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNsYXNzIGRzdQp7CnB1YmxpYzoKdmVjdG9yPGludD5wYXJlbnQ7CnZlY3RvcjxwYWlyPGludCxpbnQ+PnJhbms7CmRzdShpbnQgeSkKewoJcGFyZW50LmFzc2lnbih5KzEsLTEpOwoJcmFuay5hc3NpZ24oeSsxLHsxLElOVF9NQVh9KTsKfQppbnQgZmluZChpbnQgeCkKewppZihwYXJlbnRbeF09PS0xKSByZXR1cm4geDsKcmV0dXJuIHBhcmVudFt4XT1maW5kKHBhcmVudFt4XSk7CQoJCQp9CQppbnQgdW5pdGUoaW50IGksIGludCBqLGludCB3KQp7CmludCBzMT1maW5kKGkpOwppbnQgczI9ZmluZChqKTsKaWYoczEhPXMyKQp7CmlmKHJhbmtbczFdLmZpcnN0PnJhbmtbczJdLmZpcnN0KSAKewoJcGFyZW50W3MyXT1zMTsKCXJhbmtbczFdLmZpcnN0Kz1yYW5rW3MyXS5maXJzdDsKCXJhbmtbczFdLnNlY29uZD1taW4ocmFua1tzMV0uc2Vjb25kLHcpOwp9CmVsc2UgewoJcGFyZW50W3MxXT1zMjsKCXJhbmtbczJdLmZpcnN0Kz1yYW5rW3MxXS5maXJzdDsKCXJhbmtbczJdLnNlY29uZD1taW4ocmFua1tzMl0uc2Vjb25kLHcpOwp9CnJldHVybiAxOwp9CnJldHVybiAwOwp9Cgp9OwppbnQgbWFpbigpCnsKCWludCB0OwoJY2luPj50OwoJd2hpbGUodC0tKQoJewoJaW50IG47CgljaW4+Pm47Cglkc3UgRHN1KG4pOwoJaW50IG07CgljaW4+Pm07Cglwcmlvcml0eV9xdWV1ZTx2ZWN0b3I8aW50Pj5lZGdlOwoJd2hpbGUobS0tKQoJewoJaW50IHgseSx6OwoJY2luPj54Pj55Pj56OwkKICAgICBlZGdlLnB1c2goe3oseSx4fSk7Cgl9CglpbnQgYW5zPTA7Cgl3aGlsZSghZWRnZS5lbXB0eSgpKQoJewoJCWF1dG8gZWRnPWVkZ2UudG9wKCk7CgkJaW50IGRpc3QgPSBlZGdbMF07CgkJaW50IHY9ZWRnWzFdOwoJCWludCB1PWVkZ1syXTsKCQllZGdlLnBvcCgpOwoJCWludCBzMT1Ec3UuZmluZCh1KTsKCQlpbnQgczI9RHN1LmZpbmQodik7CgkJaWYoczEhPXMyKQoJCXsKCQlpZihEc3UucmFua1tzMV0uc2Vjb25kPT1kaXN0KWFucy09RHN1LnJhbmtbczFdLmZpcnN0OwoJCWlmKERzdS5yYW5rW3MyXS5zZWNvbmQ9PWRpc3QpIGFucy09RHN1LnJhbmtbczJdLmZpcnN0OwoJCX0KCQoJCQlpZihEc3UudW5pdGUodSx2LGRpc3QpKQoJCQl7CgkJCWFucys9bWF4KERzdS5yYW5rW3MxXS5maXJzdCxEc3UucmFua1tzMl0uZmlyc3QpOwoJICAgIAl9CgkgICAgCQlmb3IoYXV0byBpdDogRHN1LnJhbmspCgkJY291dDw8aXQuZmlyc3Q8PCIgIjw8aXQuc2Vjb25kPDxlbmRsOwoJCWNvdXQ8PGVuZGw7Cgl9CQpjb3V0PDxhbnM8PGVuZGw7CQp9CQkKCS8qCjIKNCA2CjEgMiAzCjIgMyAyCjQgMyA0CjEgNCAxCjIgNCAyCjEgMyAyCjggNwoxIDIgMgoyIDMgMQozIDQgNAo0IDUgMwo1IDYgNAo2IDcgMQo3IDggMgoJCQoJfSovCn0=