#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int pa[10010],rank1[10010];
int ans;
struct node{
int u,v,c;
}e[10010];
bool cmp(const node& e1,const node& e2){
return e1.c<e2.c;
}
void make(int x){
pa[x]=x;
rank1[x]=0;
}
int findd(int x){
if(x!=pa[x])
pa[x]=findd(pa[x]);
return pa[x];
}
void unite(int x,int y,int w){
x=findd(x);
y=findd(y);
if(x==y)
return ;
ans+=w;
if(rank1[x]<rank1[y])
pa[x]=y;
else{
pa[y]=x;
if(rank1[x]==rank1[y])
rank1[x]++;
}
}
int main(){
int n;
while(1){
scanf("%d",&n);
if(n==0) break;
ans=0;
for(int i=0;i<n*(n-1)/2;i++){
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].c);
}
for(int i=1;i<=n;i++){
make(i);
}
sort(e,e+n*(n-1)/2,cmp);
for(int i=0;i<n*(n-1)/2;i++){
int x=findd(e[i].u);
int y=findd(e[i].v);
if(x!=y) unite(x,y,e[i].c);
}
printf("%d\n",ans);
}
return 0;
}
#include <cstring>
#include <algorithm>
using namespace std;
int pa[10010],rank1[10010];
int ans;
struct node{
int u,v,c;
}e[10010];
bool cmp(const node& e1,const node& e2){
return e1.c<e2.c;
}
void make(int x){
pa[x]=x;
rank1[x]=0;
}
int findd(int x){
if(x!=pa[x])
pa[x]=findd(pa[x]);
return pa[x];
}
void unite(int x,int y,int w){
x=findd(x);
y=findd(y);
if(x==y)
return ;
ans+=w;
if(rank1[x]<rank1[y])
pa[x]=y;
else{
pa[y]=x;
if(rank1[x]==rank1[y])
rank1[x]++;
}
}
int main(){
int n;
while(1){
scanf("%d",&n);
if(n==0) break;
ans=0;
for(int i=0;i<n*(n-1)/2;i++){
scanf("%d %d %d",&e[i].u,&e[i].v,&e[i].c);
}
for(int i=1;i<=n;i++){
make(i);
}
sort(e,e+n*(n-1)/2,cmp);
for(int i=0;i<n*(n-1)/2;i++){
int x=findd(e[i].u);
int y=findd(e[i].v);
if(x!=y) unite(x,y,e[i].c);
}
printf("%d\n",ans);
}
return 0;
}