传送门
#include <bits/stdc++.h>
using namespace std;
struct N{
int p,x,y,v;
}Node[1001];
int n,m,f[1001],ans,tot;
bool cmp(N x,N y){
return x.v<y.v;
}
int father (int k){
if (f[k]!=k) f[k]=father(f[k]);
return f[k];
}
void unionn (int x,int y){
int xx=father(x);
int yy=father(y);
if (xx!=yy) f[yy]=xx;
}
int main(){
cin>>n>>m;
for (int i=1;i<=m;i++){
cin>>Node[i].p>>Node[i].x>>Node[i].y>>Node[i].v;
if (Node[i].p==1){
unionn(Node[i].x,Node[i].y);
tot++;
ans+=Node[i].v;
}
}
for (int i=1;i<=n;i++){
f[i]=i;
}
sort (Node+1,Node+m+1,cmp);
for (int i=1;i<=m;i++){
if (f[Node[i].x]==f[Node[i].y]) continue;
unionn(Node[i].x,Node[i].y);
ans+=Node[i].v;
tot++;
if (tot==n-1)
break;
}
cout<<ans<<endl;
return 0;
}