//还是畅通工程稍微修改即可
#include "bits/stdc++.h"
using namespace std;
int father[5000];
int height[5000];
struct Edge{
int begin;
int end;
int cost;
int build;
};
void Inti(){
for (int i = 0; i < 5000; ++i) {
father[i]=i;
height[i]=1;
}
}
int Find(int x){
if(x!=father[x]){
father[x]= Find(father[x]);
}
return father[x];
}
void Union(int x,int y){
int x_father = Find(x);
int y_father = Find(y);
if(height[x_father]>height[y_father]){
father[y_father] = x_father;
} else if(height[x_father]<height[y_father]){
father[x_father] = y_father;
}else{
father[y_father] = x_father;
height[x_father]++;
}
}
bool compare1(Edge x,Edge y){
if(x.build != y.build) return x.build>y.build;
return x.cost<y.cost;
}
int main() {
int n;
while (scanf("%d",&n)!=EOF){
if(n==0){ break;}
Inti();
int answer = 0;
int flag;//1已建
Edge edge[(n*(n-1))/2];
for (int i = 0; i < (n*(n-1))/2; ++i) {
scanf("%d%d%d%d",&edge[i].begin,&edge[i].end,&edge[i].cost,&edge[i].build);
}
sort(edge,edge+(n*(n-1))/2,compare1);
for (int i = 0; i < (n*(n-1))/2; ++i) {
if(Find(edge[i].begin)!=Find(edge[i].end)){
Union(edge[i].begin,edge[i].end);
if(!edge[i].build) answer+=edge[i].cost;
}
}
printf("%d\n",answer);
}
return 0;
}