import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static class Node{
		int w;
		int exist;
		public Node() {
			this.w=0;this.exist=0;
		}
		public Node(int w,int exist) {
			this.w=w;
			this.exist=exist;
		}
	}
	static class R{
		int vertax;
		int dis;
		public R(int vertax) {
			this.vertax=vertax;
			this.dis=Integer.MAX_VALUE;
		}
		@Override
		public boolean equals(Object obj) {
			if (this == obj)
				return true;
			if (obj == null)
				return false;
			if (getClass() != obj.getClass())
				return false;
			R other = (R) obj;
			if (vertax != other.vertax)
				return false;
			return true;
		}
	}
	static Comparator<R> cmp=new Comparator<R>() {

		@Override
		public int compare(R o1, R o2) {
			if(o1.dis-o2.dis<0) {
				return -1;
			}else if(o1.dis-o2.dis==0) {
				return 0;
			}else {
				return 1;
			}
		}
		
	};
	static Scanner scn=new Scanner(System.in);
	static int n,m,start;
	static int Max=Integer.MAX_VALUE,ans; 
	static Node[][] G;
	static boolean[] visit;
	static Queue<R> pri;
	static R[] form;
	public static void main(String[] args) {
		while(scn.hasNext()) {
			n=scn.nextInt();m=n*(n-1)/2;start=1;
			n+=1;
			if(m==0) break;
			G=new Node[n][n];
			visit=new boolean[n];
			pri=new PriorityQueue<>(cmp);
			form=new R[n];
			ans=0;
			for(int i=0;i<n;i++) {
				form[i]=new R(i);
				for(int j=0;j<n;j++) {
					G[i][j]=new Node();
				}
			}
			for(int i=0;i<m;i++) {
				int v=scn.nextInt(),v2=scn.nextInt(),w=scn.nextInt(),cunzai=scn.nextInt();
				G[v][v2]=G[v2][v]=new Node(w, cunzai);
			}
			prim(start);
			System.out.printf("%d\n",ans);
		}
	}
	static void prim(int start) {
		form[start].dis=0;
		pri.offer(form[start]);
		while(!pri.isEmpty()) {
			int u=pri.poll().vertax;
			visit[u]=true;
			ans+=form[u].dis;
			for(int i=1;i<n;i++) {
				int v=i;
				int w=G[u][v].w,cunzai=G[u][v].exist;
				if(!visit[v] && cunzai==1) {
					form[v].dis=0;
					while(pri.remove(form[v]));
					pri.offer(form[v]);
				}else if(G[u][v].w!=0 && !visit[v] && w<form[v].dis ) {
					form[v].dis=w;
					while(pri.remove(form[v]));
					pri.offer(form[v]);
				}
			}
		}
	}
}

/**************************************************************
	Problem: 2205
	User: admin
	Language: Java
	Result: Accepted
	Time:1091 ms
	Memory:62244 kb
****************************************************************/