#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;
const int MAX=100;

struct Edge{
    int from;
    int to;
    int length;
    bool operator<(const Edge& e)const{
        return length<e.length;
    }
};

Edge edge[MAX*MAX];
int father[MAX];
int height[MAX];

void Initialize(int n){
    for(int i=0;i<n;i++){
        father[i]= i;
        height[i]=0;
    }
    return;
}

int Find(int x){
    if(x!=father[x]){
        return Find(father[x]);
    }
    return father[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 edgeNumber){
    Initialize(n);
    sort(edge,edge+edgeNumber);
    int sum=0;
    for(int i=0;i<edgeNumber;i++){
        Edge current=edge[i];
        if(Find(current.from)!=Find(current.to)){
            Union(current.from,current.to);
            sum+=current.length;
        }
    }
    return sum;
}


int main(){
    int N;
    while(scanf("%d",&N)!=EOF){
        if(N==0){
            break;
        }
        int numD=N*(N-1)/2;
        int a,b,disAB;
        for(int i=0;i<numD;i++){
            scanf("%d %d %d",&edge[i].from,&edge[i].to,&edge[i].length);
        }
        int answer=Kruskal(N,numD);
        printf("%d\n",answer);
    }
    return 0;
}