#include <stdio.h>
#define  MAX 101


struct Dis
{
    int pa[MAX];
    int used[MAX];
    int n;
    Dis(int n):n(n)
    {
        for(int i=0;i<n;i++)
        {
            pa[i]=i;
            used[i]=0;
        }
    }
    void use(int i)
    {
        used[i]=1;
    }
    int root(int a)
    {
        if(pa[a]==a)
            return a;
        return pa[a]=root(pa[a]);
    }
    bool is_same_set(int a,int b)
    {
        return root(a)==root(b);
    }
    void unite(int n,int m)
    {
        use(n);
        use(m);
        pa[root(n)]=root(m);
    }
    bool is_connected()
    {
        int rt=-1;
        for(int i=0;i<n;i++)
        {
            if(rt>=0 &&used[i] && rt!=root(i))
                return false;
            if(used[i])
                rt=root(i);
        }
        return rt!=-1;
    }
};

int br[6000][3];

int getMin(int m)
{
    int tmp=-1;
    for(int i=0;i<m;i++)
    {
        if(br[i][2]!=-1)
        {
            if(tmp==-1 || br[tmp][2]>=br[i][2])
            {
                tmp=i;
            }
        }
    }
    if(tmp!=-1)
    {
        return tmp;
    }
}

int main(void)
{
    int n,m;
    while(scanf("%d%d",&n,&m)==2 && n && m)
    {
        Dis dis(n);
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",br[i],br[i]+1,br[i]+2);
        }
        int nc=0;
        int cost=0;
        while(nc<n)
        {
            int min=getMin();
            int a=br[min][0];
            int b=br[min][1];
            if(!dis.is_same_set(a,b))
            {
                dis.unite(a,b);
                nc++;
                cost+=br[min][2];
                br[min][2]=-1;
            }
        }
        printf("%d\n",cost);
    }
    return 0;
    
}