//最小生成树 用了贪心的思想每次选符合条件的最短边直到边取完 或 所有点之间已可互达。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int MAXN = 1000;
struct edge
{
int u,e,v;
}e[MAXN*100];
bool cmp(edge a,edge b)
{
return a.v<b.v;
}
int f[MAXN*MAXN];
int find(int x)
{
if(f[x]==x)return f[x];
else return f[x]=find(f[x]);
}
int main()
{
int n,m,ans=0;
while(scanf("%d",&n)!=EOF && n!=0 )
{
ans=0;
int m=(n-1)*n/2;
for(int i=1;i<=m;i++){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
e[i].u=x;e[i].e=y;e[i].v=z;
}
for(int i=1;i<=n;i++) f[i]=i;
sort(e+1,e+m+1,cmp);
int road=n-1;
for(int i=1;i<=m;i++)
{
int x=find(e[i].u);
int y=find(e[i].e);
if(x!=y)
{
f[x]=y;
ans+=e[i].v;
road--;
}
if(road==0) break;
}
cout<<ans<<endl;
}
return 0;
}