#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge{
int a;
int b;
int w;
Edge(int x,int y,int z): a(x), b(y), w(z){
};
};
bool compare(Edge a, Edge b){
return a.w<b.w;
}
const int N = 110;
int p[N];
int h[N];
void init(int n){
for(int i=1;i<=n;i++){
p[i]=i;
h[i]=0;
}
}
int find(int a){
if(a!=p[a])p[a]=find(p[a]);
return p[a];
}
void cunion(int a,int b){
int x = find(a);
int y = find(b);
if(x!=y){
if(h[x]>h[y]){
p[y]=x;
}else if(h[x]<h[y]){
p[x]=y;
}else{
p[x]=y;
h[y]++;
}
}
return;
}
int kruskal(vector<Edge> edges){
int ans=0;
for(int i=0;i<edges.size();i++){
int a=edges[i].a;
int b=edges[i].b;
//cout<<a<<' '<<b<<endl;
if(find(a)!=find(b)){
cunion(a, b);
ans+=edges[i].w;
}
}
return ans;
}
int main() {
int n;
while(cin>>n){
if(!n)break;
init(n);
int m = n*(n-1)/2;
vector<Edge> edges;
while(m--){
int a,b,w;
bool st;
cin>>a>>b>>w>>st;
//cout<<st<<endl;
if(st)w=0;
edges.push_back(Edge(a,b,w));
}
sort(edges.begin(),edges.end(),compare);
int ans = kruskal(edges);
cout<<ans<<endl;
}
}