#include <iostream>
#include <algorithm>
using namespace std;
const int N=102;
//边结点
struct Edge{
    int from;
    int to;
    int length;
    bool operator<(const Edge& e)const{
        return length<e.length;
    }
};
Edge edge[N*N]; //存储图的所有边结点
int father[N];
int height[N];
void Initial(int n){
    for(int i=0;i<n;i++){
        father[i]=i;
        height[i]=0;
    } 
}
int Find(int x){
    while(father[x]!=x) x=father[x];
    return x;
}
void Union(int x,int y){
    x=Find(x);
    y=Find(y);
    if(x!=y){
        if(height[x]<height[y]) father[x]=y;
        else if(height[y]<height[x]) father[y]=x;
        else {
            father[y]=x;
            height[x]++;
        } 
    }
    return;
}
int Kruskal(int n,int edgeNum){  //总共结点数,总共边数
    int sum=0;
    Initial(n);
    sort(edge,edge+edgeNum);
    for(int i=0;i<edgeNum;i++){
        if(Find(edge[i].from)!=Find(edge[i].to)){
            Union(edge[i].from,edge[i].to);
            sum+=edge[i].length;
        }
    }
    return sum;
}
int main(){
    int n;
    while(cin>>n){
        if(n==0) break;
        int m=n*(n-1)/2;
        for(int i=0;i<m;i++) cin>>edge[i].from>>edge[i].to>>edge[i].length;
        int ans=Kruskal(n,m);
        cout<<ans<<endl;
    }
    return 0;
}