/*
1 4 4 0 1 20 1 2 2 2 3 8 3 1 10
*/
//modified dijkstra for finding the weight of the minimum shortest path tree
#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define mod 100000000000
vector<vector<pair<ll,ll>>> adj;
vector<ll> par;//this is for dijkstra
vector<ll> dist;//this is for dijkstra
vector<ll> lastadded;
//this is for kruskal
vector<ll> parent;
vector<ll> siz;
struct edge{
ll u;
ll v;
ll w;
edge(ll a,ll b,ll c):u(a),v(b),w(c)
{
}
bool operator <(const edge& other)
{
return w<other.w;
}
};
vector<edge> edges;
struct node
{
ll vertex;
ll dist;
// ll lastadded;
//we dont need this last added in the nodes as we have made a last added vector
//we would update there
node(ll a=0,ll b=0):vertex(a),dist(b)
{
}
};
void initialize(ll n)
{
//this clumsy thing got error
adj.clear();
par.clear();
dist.clear();
edges.clear();
parent.clear();
parent.assign(n,0);
siz.clear();
adj.resize(n);
par.assign(n,0);
dist.assign(n,LONG_MAX);
lastadded.assign(n,LONG_MAX);
siz.assign(n,1);
for(ll i=0;i<n;i++)
{
parent[i]=i;//self parent
}
}
//do we need to write the logic for lastadded in the pq..
//because we are just extracting the min and for extracting
//in pq even if the logic is with comparing just the dist...
//we can make the last added change accordingly..
bool operator<(const node& n1,const node& n2)
{
return n1.dist>n2.dist;
}
ll dijkstra(ll s,ll n)
{
// priority_queue<node,vector<node>,cmp> pq;
priority_queue<node> pq;
node temp(s,0);
dist[s]=0;
//no change in lastadded for the source
//for evernode we have to update the parent and dist and lastadded
pq.push(temp);
while(!pq.empty())
{
temp=pq.top();
pq.pop();
ll u=temp.vertex;
for(auto p:adj[u])
{
ll v=p.first;
ll wei=p.second;
if(dist[v]>dist[u]+wei||((dist[v]==dist[u]+wei)&&lastadded[v]>wei))
//this should work as next time when some node with greater would be picked then
{
dist[v]=dist[u]+wei;
lastadded[v]=wei;
par[v]=u;//no need but still
node tem(v,dist[v]);
pq.push(tem);
//tem is the node
}
}
}
//now just add the value in the last added array..
ll res=0;
for(ll i=1; i<n; i++)
{
// cout<<lastadded[i]<<" "<<i<<endl;
if(lastadded[i]==LONG_MAX){return -1;}
res+=lastadded[i];
// res%=mod;
}
return res;
}
ll fparent(ll i)
{
if(i==parent[i])
{
return i;
}
return parent[i]=fparent(parent[i]);
}
void unionw(ll u,ll v)
{
ll pu=fparent(u);
ll pv=fparent(v);
if(siz[pu]>siz[pv])
{
siz[pu]+=siz[pv];
parent[pv]=pu;
parent[v]=pu;
}
else{
siz[pv]+=siz[pu];
parent[pu]=pv;
parent[u]=pv;
}
}
ll kruskal(ll n,ll m)
{
ll cost=0;//this is to be outputted
for(ll i=0;i<m;i++)
{
ll u=edges[i].u;
ll v=edges[i].v;
ll w=edges[i].w;
if(fparent(u)!=fparent(v))
{
// cout<<"uv"<<u<<v<<endl;
unionw(u,v);
cost+=w;
// cost%=mod;
}
}
return cost;
}
//there may be disconnected graphs as well
int main()
{
ll t;
cin>>t;
while(t--)
{
ll n;
cin>>n;
ll m;
cin>>m;
initialize(n);
for(ll i=0; i<m; i++)
{
ll a;
cin>>a;
ll b;
cin>>b;
ll w;
cin>>w;
edge e(a,b,w);
edges.push_back(e);
adj[a].push_back({b,w});
adj[b].push_back({a,w});
}
//source is said to be 0
// cout<<dijkstra(0,n)<<endl;
ll res1=dijkstra(0,n);
// cout<<res1<<endl<<flush;
//we have to make the nodes for the edges because kruskals apply on edges and not
//vertices
//first sort the edge vector
sort(edges.begin(),edges.end());
// for(auto i:edges)
// {
// cout<<i.w<<endl;
// }
if(res1<0)
{
cout<<"NO"<<endl;
continue;
}
ll res2=kruskal(n,m);
// cout<<res2<<endl;
if(res1==res2)
{
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
LyoKMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAxIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAyIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAzIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAxIDEwCiovCgovL21vZGlmaWVkIGRpamtzdHJhIGZvciBmaW5kaW5nIHRoZSB3ZWlnaHQgb2YgdGhlIG1pbmltdW0gc2hvcnRlc3QgcGF0aCB0cmVlCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCi8vI2RlZmluZSBtb2QgMTAwMDAwMDAwMDAwCnZlY3Rvcjx2ZWN0b3I8cGFpcjxsbCxsbD4+PiBhZGo7CnZlY3RvcjxsbD4gcGFyOy8vdGhpcyBpcyBmb3IgZGlqa3N0cmEKdmVjdG9yPGxsPiBkaXN0Oy8vdGhpcyBpcyBmb3IgZGlqa3N0cmEKdmVjdG9yPGxsPiBsYXN0YWRkZWQ7CgovL3RoaXMgaXMgZm9yIGtydXNrYWwKdmVjdG9yPGxsPiBwYXJlbnQ7CnZlY3RvcjxsbD4gc2l6OwpzdHJ1Y3QgZWRnZXsKICAgIGxsIHU7CiAgICBsbCB2OwogICAgbGwgdzsKICAgIGVkZ2UobGwgYSxsbCBiLGxsIGMpOnUoYSksdihiKSx3KGMpCiAgICB7CgogICAgfQogICAgYm9vbCBvcGVyYXRvciA8KGNvbnN0IGVkZ2UmIG90aGVyKQogICAgewogICAgICAgIHJldHVybiB3PG90aGVyLnc7CiAgICB9Cn07CnZlY3RvcjxlZGdlPiBlZGdlczsKc3RydWN0IG5vZGUKewogICAgbGwgdmVydGV4OwogICAgbGwgZGlzdDsKLy8gICAgbGwgbGFzdGFkZGVkOwogICAgLy93ZSBkb250IG5lZWQgdGhpcyBsYXN0IGFkZGVkIGluIHRoZSBub2RlcyBhcyB3ZSBoYXZlIG1hZGUgYSBsYXN0IGFkZGVkIHZlY3RvcgogICAgLy93ZSB3b3VsZCB1cGRhdGUgdGhlcmUKICAgIG5vZGUobGwgYT0wLGxsIGI9MCk6dmVydGV4KGEpLGRpc3QoYikKICAgIHsKCiAgICB9Cn07CnZvaWQgaW5pdGlhbGl6ZShsbCBuKQp7CiAgICAvL3RoaXMgY2x1bXN5IHRoaW5nIGdvdCBlcnJvcgogICAgYWRqLmNsZWFyKCk7CiAgICBwYXIuY2xlYXIoKTsKICAgIGRpc3QuY2xlYXIoKTsKICAgIGVkZ2VzLmNsZWFyKCk7CiAgICBwYXJlbnQuY2xlYXIoKTsKICAgIHBhcmVudC5hc3NpZ24obiwwKTsKICAgIHNpei5jbGVhcigpOwogICAgYWRqLnJlc2l6ZShuKTsKICAgIHBhci5hc3NpZ24obiwwKTsKICAgIGRpc3QuYXNzaWduKG4sTE9OR19NQVgpOwogICAgbGFzdGFkZGVkLmFzc2lnbihuLExPTkdfTUFYKTsKICAgIHNpei5hc3NpZ24obiwxKTsKICAgIGZvcihsbCBpPTA7aTxuO2krKykKICAgIHsKICAgICAgICBwYXJlbnRbaV09aTsvL3NlbGYgcGFyZW50CiAgICB9Cgp9Ci8vZG8gd2UgbmVlZCB0byB3cml0ZSB0aGUgbG9naWMgZm9yIGxhc3RhZGRlZCBpbiB0aGUgcHEuLgovL2JlY2F1c2Ugd2UgYXJlIGp1c3QgZXh0cmFjdGluZyB0aGUgbWluIGFuZCBmb3IgZXh0cmFjdGluZwovL2luIHBxIGV2ZW4gaWYgdGhlIGxvZ2ljIGlzIHdpdGggY29tcGFyaW5nIGp1c3QgdGhlIGRpc3QuLi4KLy93ZSBjYW4gbWFrZSB0aGUgbGFzdCBhZGRlZCBjaGFuZ2UgYWNjb3JkaW5nbHkuLgpib29sIG9wZXJhdG9yPChjb25zdCBub2RlJiBuMSxjb25zdCBub2RlJiBuMikKewogICAgcmV0dXJuIG4xLmRpc3Q+bjIuZGlzdDsKfQoKbGwgZGlqa3N0cmEobGwgcyxsbCBuKQp7Ci8vICAgIHByaW9yaXR5X3F1ZXVlPG5vZGUsdmVjdG9yPG5vZGU+LGNtcD4gcHE7CiAgICBwcmlvcml0eV9xdWV1ZTxub2RlPiBwcTsKICAgIG5vZGUgdGVtcChzLDApOwogICAgZGlzdFtzXT0wOwogICAgLy9ubyBjaGFuZ2UgaW4gbGFzdGFkZGVkIGZvciB0aGUgc291cmNlCiAgICAvL2ZvciBldmVybm9kZSB3ZSBoYXZlIHRvIHVwZGF0ZSB0aGUgcGFyZW50IGFuZCBkaXN0IGFuZCBsYXN0YWRkZWQKICAgIHBxLnB1c2godGVtcCk7CiAgICB3aGlsZSghcHEuZW1wdHkoKSkKICAgIHsKICAgICAgICB0ZW1wPXBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIGxsIHU9dGVtcC52ZXJ0ZXg7CiAgICAgICAgZm9yKGF1dG8gcDphZGpbdV0pCiAgICAgICAgewogICAgICAgICAgICBsbCB2PXAuZmlyc3Q7CiAgICAgICAgICAgIGxsIHdlaT1wLnNlY29uZDsKICAgICAgICAgICAgaWYoZGlzdFt2XT5kaXN0W3VdK3dlaXx8KChkaXN0W3ZdPT1kaXN0W3VdK3dlaSkmJmxhc3RhZGRlZFt2XT53ZWkpKQogICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCB3b3JrIGFzIG5leHQgdGltZSB3aGVuIHNvbWUgbm9kZSB3aXRoIGdyZWF0ZXIgd291bGQgYmUgcGlja2VkIHRoZW4KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZGlzdFt2XT1kaXN0W3VdK3dlaTsKICAgICAgICAgICAgICAgIGxhc3RhZGRlZFt2XT13ZWk7CiAgICAgICAgICAgICAgICBwYXJbdl09dTsvL25vIG5lZWQgYnV0IHN0aWxsCiAgICAgICAgICAgICAgICBub2RlIHRlbSh2LGRpc3Rbdl0pOwogICAgICAgICAgICAgICAgcHEucHVzaCh0ZW0pOwogICAgICAgICAgICAgICAgLy90ZW0gaXMgdGhlIG5vZGUKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vbm93IGp1c3QgYWRkIHRoZSB2YWx1ZSBpbiB0aGUgbGFzdCBhZGRlZCBhcnJheS4uCiAgICBsbCByZXM9MDsKICAgIGZvcihsbCBpPTE7IGk8bjsgaSsrKQogICAgewovLyAgICAgICAgY291dDw8bGFzdGFkZGVkW2ldPDwiICI8PGk8PGVuZGw7CiAgICAgICAgaWYobGFzdGFkZGVkW2ldPT1MT05HX01BWCl7cmV0dXJuIC0xO30KICAgICAgICByZXMrPWxhc3RhZGRlZFtpXTsKLy8gICAgICAgIHJlcyU9bW9kOwogICAgfQogICAgcmV0dXJuIHJlczsKfQpsbCBmcGFyZW50KGxsIGkpCnsKICAgIGlmKGk9PXBhcmVudFtpXSkKICAgIHsKICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIHJldHVybiBwYXJlbnRbaV09ZnBhcmVudChwYXJlbnRbaV0pOwp9CnZvaWQgdW5pb253KGxsIHUsbGwgdikKewogICAgbGwgcHU9ZnBhcmVudCh1KTsKICAgIGxsIHB2PWZwYXJlbnQodik7CiAgICBpZihzaXpbcHVdPnNpeltwdl0pCiAgICB7CiAgICAgICAgc2l6W3B1XSs9c2l6W3B2XTsKICAgICAgICBwYXJlbnRbcHZdPXB1OwogICAgICAgIHBhcmVudFt2XT1wdTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgc2l6W3B2XSs9c2l6W3B1XTsKICAgICAgICBwYXJlbnRbcHVdPXB2OwogICAgICAgIHBhcmVudFt1XT1wdjsKICAgIH0KfQoKbGwga3J1c2thbChsbCBuLGxsIG0pCnsKICAgIGxsIGNvc3Q9MDsvL3RoaXMgaXMgdG8gYmUgb3V0cHV0dGVkCiAgICBmb3IobGwgaT0wO2k8bTtpKyspCiAgICB7CiAgICAgICAgbGwgdT1lZGdlc1tpXS51OwogICAgICAgIGxsIHY9ZWRnZXNbaV0udjsKICAgICAgICBsbCB3PWVkZ2VzW2ldLnc7CiAgICAgICAgaWYoZnBhcmVudCh1KSE9ZnBhcmVudCh2KSkKICAgICAgICB7Ci8vICAgICAgICAgICAgY291dDw8InV2Ijw8dTw8djw8ZW5kbDsKICAgICAgICAgICAgdW5pb253KHUsdik7CiAgICAgICAgICAgIGNvc3QrPXc7Ci8vICAgICAgICAgICAgY29zdCU9bW9kOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY29zdDsKfQovL3RoZXJlIG1heSBiZSBkaXNjb25uZWN0ZWQgZ3JhcGhzIGFzIHdlbGwKaW50IG1haW4oKQp7CiAgICBsbCB0OwogICAgY2luPj50OwogICAgd2hpbGUodC0tKQogICAgewoKICAgICAgICBsbCBuOwogICAgICAgIGNpbj4+bjsKICAgICAgICBsbCBtOwogICAgICAgIGNpbj4+bTsKICAgICAgICBpbml0aWFsaXplKG4pOwogICAgICAgIGZvcihsbCBpPTA7IGk8bTsgaSsrKQogICAgICAgIHsKCiAgICAgICAgICAgIGxsIGE7CiAgICAgICAgICAgIGNpbj4+YTsKICAgICAgICAgICAgbGwgYjsKICAgICAgICAgICAgY2luPj5iOwogICAgICAgICAgICBsbCB3OwogICAgICAgICAgICBjaW4+Pnc7CiAgICAgICAgICAgIGVkZ2UgZShhLGIsdyk7CiAgICAgICAgICAgIGVkZ2VzLnB1c2hfYmFjayhlKTsKICAgICAgICAgICAgYWRqW2FdLnB1c2hfYmFjayh7Yix3fSk7CiAgICAgICAgICAgIGFkaltiXS5wdXNoX2JhY2soe2Esd30pOwogICAgICAgIH0KICAgICAgICAvL3NvdXJjZSBpcyBzYWlkIHRvIGJlIDAKLy8gICAgICAgIGNvdXQ8PGRpamtzdHJhKDAsbik8PGVuZGw7CiAgICAgICAgbGwgcmVzMT1kaWprc3RyYSgwLG4pOwovLyAgICAgICAgY291dDw8cmVzMTw8ZW5kbDw8Zmx1c2g7CgoKICAgICAgICAvL3dlIGhhdmUgdG8gbWFrZSB0aGUgbm9kZXMgZm9yIHRoZSBlZGdlcyBiZWNhdXNlIGtydXNrYWxzIGFwcGx5IG9uIGVkZ2VzIGFuZCBub3QKICAgICAgICAvL3ZlcnRpY2VzCiAgICAgICAgLy9maXJzdCBzb3J0IHRoZSBlZGdlIHZlY3RvcgogICAgICAgIHNvcnQoZWRnZXMuYmVnaW4oKSxlZGdlcy5lbmQoKSk7Ci8vICAgICAgICBmb3IoYXV0byBpOmVkZ2VzKQovLyAgICAgICAgewovLyAgICAgICAgICAgIGNvdXQ8PGkudzw8ZW5kbDsKLy8gICAgICAgIH0KICAgICAgICBpZihyZXMxPDApCiAgICAgICAgewogICAgICAgICAgICBjb3V0PDwiTk8iPDxlbmRsOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgbGwgcmVzMj1rcnVza2FsKG4sbSk7Ci8vICAgICAgICBjb3V0PDxyZXMyPDxlbmRsOwoKICAgICAgICBpZihyZXMxPT1yZXMyKQogICAgICAgIHsKICAgICAgICAgICAgY291dDw8IllFUyI8PGVuZGw7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGNvdXQ8PCJOTyI8PGVuZGw7CiAgICAgICAgfQogICAgfQp9Cg==