#include<iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#define LL long long
#define GG int
#define For(i, j, k) for(int i=j; i<=k; i++)
#define Dow(i, j, k) for(int i=j; i>=k; i--)
using namespace std;
const int N = 1011;
int n, m;
int f[N];
struct node {
int x, y, val;
}e[10000];
inline GG read() {
GG x = 0, f = 1;
char ch = getchar();
while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
while(ch>='0'&&ch<='9') { x = x*10+ch-48; ch = getchar(); }
return x * f;
}
int cmp(node a, node b) {
return a.val < b.val;
}
int find(int x) {
if(f[x] == x) return x;
f[x] = find(f[x]);
return f[x];
}
int main() {
while(~scanf("%d", &n)){
if(n == 0)
return 0;
m = n*(n-1)/2;
int wzt = 0;
For(i, 1, n) f[i] = i;
int ans = 0, tot = 0;
For(i, 1, m) {
int x, y, v, opt;
x = read(); y = read(); v = read(); opt = read();
if(opt == 1) {
int xx = find(x);
int yy = find(y);
if(yy != xx) tot++;
f[yy] = xx;
continue;
}
wzt++;
e[wzt].x = x; e[wzt].y = y; e[wzt].val = v;
}
sort(e+1, e+wzt+1, cmp);
if(tot!=n-1) For(i, 1, wzt) {
int xx = find(e[i].x);
int yy = find(e[i].y);
if(xx != yy) f[yy] = xx, ans += e[i].val, ++tot;
if(tot==n-1) break;
}
// if(tot==n-1)
printf("%d\n", ans);
}
return 0;
}