#include <iostream>
#include <algorithm>
const int N=10005;
using namespace std;
struct edge
{
int u,v,w;
bool operator <(const edge &b)const
{
return this->w < b.w;
}
}e[N];
int par[N];
void init()
{
for(int i=0;i<N;i++) par[i]=i;
}
int Find(int x)
{
if(par[x]==x) return x;
else return Find(par[x]);
}
int kruscal(int n,int m)
{
init();
sort(e,e+m);
int ans=0;
for(int i=0;i<m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(Find(u)==Find(v)) continue;
par[Find(u)]=Find(v);
ans+=w;
}
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
while(cin>>n&&n){
m=n*(n-1)/2;
for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
cout<<kruscal(n,m)<<endl;
}
return 0;
}
#include <iostream>
#include <algorithm>
const int N=10005;
using namespace std;
struct edge
{
int u,v,w;
}e[N];
int par[N];
bool cmp(edge a,edge b)
{
return a.w<b.w;
}
void init()
{
for(int i=0;i<N;i++) par[i]=i;
}
int Find(int x)
{
if(par[x]==x) return x;
else return Find(par[x]);
}
int kruscal(int n,int m)
{
init();
sort(e,e+m,cmp);
int ans=0;
for(int i=0;i<m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(Find(u)==Find(v)) continue;
par[Find(u)]=Find(v);
ans+=w;
}
return ans;
}
int main()
{
std::ios::sync_with_stdio(false);
int n,m;
while(cin>>n&&n){
m=n*(n-1)/2;
for(int i=0;i<m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
cout<<kruscal(n,m)<<endl;
}
return 0;
}