#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")