#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(vector<int> lhs, vector<int> rhs) {
    if(lhs[3]==1&&rhs[3]==0){
        return false;
    }else if(lhs[3]==0&&rhs[3]==1){
        return true;
    }
    return lhs[2] < rhs[2];
}

int father[1000];
int findfather(int u) {
    if (father[u] == u) {
        return u;
    } else {
        return findfather(father[u]);
    }
}
void unionset(int u, int v) {
    int u1 = findfather(u);
    int v1 = findfather(v);
    father[v1] = u1;
}
void initate(int n) {
    for (int i = 0; i < n; i++) {
        father[i] = i;
    }
}
int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        initate(n+1);
        if (n == 0) break;
        int sum = 0;
        vector < vector<int>> edge(n* (n - 1) / 2);
        int tmp1,tmp2,tmp3,tmp4;
        for (int i = 0; i < n * (n - 1) / 2; i++) {
            scanf("%d%d%d%d", &tmp1, &tmp2, &tmp3, &tmp4);
            int notbuild = 0;
            if (tmp4 == 1) unionset(tmp1, tmp2);
                edge[i].push_back(tmp1);
                edge[i].push_back(tmp2);
                edge[i].push_back(tmp3);
                edge[i].push_back(tmp4);
            }
        
        sort(edge.begin(), edge.end(), cmp);
        int count = 0;
        for (int i = 1; i <= n; i++) {
            if (father[i] == i) count++;
        }
        int no = 0;
        for (int i = 0; i < count - 1; i++) {
            while (findfather(edge[no][0]) == findfather(edge[no][1])) {
                no++;
            }
            sum += edge[no][2];
            unionset(edge[no][0],edge[no][1]);
        }
        edge.clear();
        printf("%d\n",sum);
    }
}