//hlog 9958 最小生成树,prim算法 



#include<iostream>
using namespace std;
const int Max=100,Maxval=INT_MAX;
bool visited[Max];
int dist[Max];
struct Graph{
    int mat[Max][Max];
    int vexnum;
    void Creategraph(int n,int m);
    
};

void Graph::Creategraph(int n,int m)
{
    int i,j,a,b,c;
    vexnum=n;
    for(i=0;i<vexnum;i++){//每一条边赋初值; 
        for(j=0;j<vexnum;j++)
        {
            mat[i][j]=Maxval;//一开始假设每一对顶点之间都是没边 
         } 
         mat[i][i]=0;//自己到自己为0 
    }
    for(i=0;i<m;i++)
    {
        cin>>a>>b>>c;//输入a到b有边,权值是c; 
        a--;//题目下标从一开始,我们是从零 
        b--;
        mat[a][b]=c;
        mat[b][a]=c;
    }
    
}

int Minvertex(int vexnum)//dist数组里找一个最小值,要求没被访问过 
{
    int i,k=-1;
    int min=Maxval;
    for(i=0;i<vexnum;i++)
    {
        if(dist[i]<min&&visited[i]==false)
        {
         min=dist[i];
         k=i;
        }
    }
    return k;
}

int Prim(Graph G,int u){
    
    int i,v;
    for(i=0;i<G.vexnum;i++)
    {
        dist[i]=G.mat[u][i];//当前顶点的最小权值,不断变化 
        
    }
    fill(visited,visited+G.vexnum,false);//标记数组,一开始全为false; 
    visited[u]=true;
    for(v=1;v<=G.vexnum-1;v++)
    {
        int k=Minvertex(G.vexnum);
        if(k==-1) break;
       visited[k]=true;
       for(i=0;i<G.vexnum;i++)
       {
           if(visited[i]==false&&G.mat[k][i]<dist[i])
           dist[i]=G.mat[k][i];
       }
    }
    
    int res=0;
    for(i=0;i<G.vexnum;i++)
    {
        res+=dist[i];
    }
    return res;
}

int main()
{
    int n,m,min;//顶点数,边数 
    while(cin>>n)
    {
        if(n==0) break;
        m=n*(n-1)/2;
        Graph G;//定义一个图G; 
        G.Creategraph(n,m);//建n个顶点,m条边的图 
        min=Prim(G,0);
        cout<<min<<endl;
    }
    return 0;
}