program kruskal; const maxn=105; type node=record fromv,endv,data:integer; end; arr=array[1..maxn] of integer; jilu=array[1..maxn*maxn] of node; var father:array[1..maxn] of integer; elist:jilu; c:array[1..maxn] of integer; i,j,t,x,y,n,d,t1,num,ans:integer; procedure swap(var a,b:node); var temp:node; begin temp:=a;a:=b;b:=temp; end; procedure sort(var a:jilu;l,r:integer); var i,j,mid,k:integer; begin if l>=r then exit; i:=l; mid:=a[(l+r) div 2].data; for k:=l to r do begin if a[k].data <= mid then begin swap(a[i],a[k]); inc(i); end; end; j:=i; dec(i); while (i>=l)and (a[i].data=mid) do dec(i); while (j<=r) and (a[j].data=mid) do inc(j); sort(a,l,i-1); sort(a,j,r); end; function find(i:integer):integer; begin if i=father[i] then exit(i); father[i]:=find(father[i]); exit(father[i]); end; procedure unit1(a,b:integer); var a1,a2:integer; begin a1:=find(a);a2:=find(b); if a1<>a2 then father[a1]:=a2; end; function judge(a,b:integer):boolean; var a1,a2:integer; begin a1:=find(a); a2:=find(b); exit(a1=a2); end; procedure sort1(); var i,j,t:integer; begin for i:=1 to num do begin t:=i; for j:=i+1 to num do if elist[t].data>elist[j].data then t:=j; if t<>i then swap(elist[t],elist[i]); end; end; begin //sort(father,1,8); //assign(input,'aaa.txt'); //reset(input); while(true) do begin readln(n); for i:=1 to n do father[i]:=i; if(n=0) then break; num:=0; for i:=1 to n*(n-1) div 2 do begin readln(x,y,d,t); if t=1 then unit1(x,y) else begin inc(num); elist[num].fromv:=x; elist[num].endv:=y; elist[num].data:=d; end; end; sort1; ans:=0; for i:=1 to num do begin if not(judge(elist[i].fromv,elist[i].endv)) then begin inc(ans,elist[i].data); unit1(elist[i].fromv,elist[i].endv); end; end; writeln(ans); end; end. /************************************************************** Problem: 2205 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/