//#include<stdio.h>
//#include<stdlib.h>
//int N,M,t[101],i,j,r;
//typedef struct e{int f,t,c;}e;
//e B[101];
//int cmp(const void *a,const void *b){e x=*(e*)a,y=*(e*)b;return x.c-y.c;}
//void in(n){for(;n--;)t[n]=n;}
//int p(n){return t[n]=t[n]==n?n:p(t[n]);}
//void u(a,b){t[p(a)]=p(b);}
//int s(a,b){return p(a)==p(b);}
//
//main()
//{
//	for(;scanf("%d%d",&N,&M),N,M;)
//	{
//		in(N);
//		for(i=r=0;i<M;i++)
//			scanf("%d%d%d",&B[i].f,&B[i].t,&B[i].c);
//		qsort(B,M,sizeof(e),cmp);
//		for(i=0;i<M;i++)
//			if(!s(B[i].f,B[i].t))
//			{
//				u(B[i].f,B[i].t);
//				r+=B[i].c;
//			}
//		printf("%d\n",r);
//	}
//	return 0;
//}
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<cmath>
#define MAX_N 10005
using namespace std;

typedef struct edge
{
	int from,to,cost;
} edge;

bool mcmp(edge x,edge y)
{
	return x.cost<y.cost;
}

int uft[MAX_N];
vector<edge>e;

void init(int n)
{
	int i;
	for (i=0;i<=n;i++)
	uft[i]=i;
}

int parent(int n)
{
	if (uft[n]==n)
		return n;
	else
		return uft[n]=parent(uft[n]);
}

void unit(int p, int q)
{
	uft[parent(p)]=parent(q);
}

int same(int p, int q)
{
	return parent(p)==parent(q);
}

int kruskal(int n,int r)
{
	int res=0;
	sort(e.begin(),e.end(),mcmp);
	init(n);
	for(int i=0;i<r;i++)
	{
		edge tmp=e[i];
		if(!same(tmp.from,tmp.to))
		{
			res+=tmp.cost;
			unit(tmp.from,tmp.to);
		}
	}
	return res;
}

int piles[10001][2];
int m_distance(int f,int t)
{
	return pow((double)piles[f][0]-piles[t][0],2)+pow((double)piles[f][1]-piles[t][1],2);
}

int main()
{
	int N,M;
	for(;scanf("%d%d",&N,&M),N,M;)
	{
		for(int j=0;j<M;j++)
		{
			edge tmp;
			scanf("%d%d%d",&tmp.from,&tmp.to,&tmp.cost);
			e.push_back(tmp);
		}
		printf("%d\n",kruskal(N,M));
		e.clear();
	}
	return 0;
}