#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<cctype>
#include<complex>
#include<iostream>
#include<sstream>
#include<algorithm>
#include<functional>
#include<vector>
#include<string>
#include<stack>
#include<queue>
#include<map>

using namespace std;
const int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
#define INF 1e+8
#define rep(i,j) for(int i = 0; i < (j); i++)
#define reps(i,j,k) for(int i = j; i < k; i++)
typedef long long ll;
typedef unsigned long long ull;
int par[128];
int rank[128];
struct edge{
	int from,to,cst;
};
bool cmp(const edge& left, const edge& right){
	return left.cst < right.cst;
}
void init(int n){
	rep(i,n){
		par[i] = i;
		rank[i] = 0;
	}
}
int find(int x){
	if(par[x] == x)return x;
	else return par[x] = find(par[x]);
}
void unite(int x,int y){
	x = find(x);
	y = find(y);
	if(x == y)return ;
	if(rank[x] < rank[y]){
		par[x] = y;
	}
	else{
		par[y] = x;
		if(rank[x] == rank[y])rank[x]++;
	}
}
bool same(int x,int y){
	return find(x) == find(y);
}
edge Data[128];
int main(){
	int n,m;
	while(1){
		scanf("%d%d",&n,&m);
		if(n == m && n == 0)break;
		memset(Data,0,sizeof(Data));
		rep(i,m){
			scanf("%d%d%d",&Data[i].from,&Data[i].to,&Data[i].cst);
		}
		sort(Data,Data+m,cmp);
		init(n);
		int ans = 0;
		rep(i,m){
			edge next = Data[i];
			if(!same(next.from, next.to)){
				unite(next.from,next.to);
				ans += next.cst;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}