#include <iostream> #include<algorithm> using namespace std; #define maxnum 100 int tree[maxnum]; int height[maxnum]; struct edge{ int from; int to; int weight; }edges[maxnum*(maxnum-1)/2]; bool compare(edge x,edge y){ return x.weight<y.weight; } void initial(int n){ for(int i=1;i<=n;++i){ tree[i]=i; height[i]=0; } } int find(int x){ if(tree[x]!=x){ tree[x]=find(tree[x]); } return tree[x]; } void Union(int x,int y){ x=find(x); y=find(y); if(x==y) return; if(height[x]>height[y]){ tree[y]=x; } else if(height[x]<height[y]){ tree[x]=y; } else{ tree[y]=x; height[x]++; } } int kruskal(int edgesize){ sort(edges,edges+edgesize,compare); int res=0; for(int i=0;i<edgesize;++i){ edge cur=edges[i]; if(find(cur.from)!=find(cur.to)){ res+=cur.weight; Union(cur.from,cur.to); } } return res; } int main() { int n; while(cin>>n){ if(n==0) break; int edgesize=n*(n-1)/2; initial(n); for(int i=0;i<edgesize;++i){ int m; cin>>edges[i].from>>edges[i].to>>edges[i].weight>>m; if(m==1) Union(edges[i].from,edges[i].to); } cout<<kruskal(edgesize)<<endl; } } // 64 位输出请用 printf("%lld")