#include <stdio.h>
#include <iostream>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <vector>

using namespace std;

#define MAX_N 10010

int P[10010];
int A[1001];
int B[1001];
int COST[1001];
int N;
int M;
pair<int,int> bridge[1001];

void init(int N) { // 初期化 はじめは全ての頂点はバラバラ
	for (int i=0; i<N; ++i) P[i] = i;
}

int root(int a) { // a の root(代表元) を求める
	if (P[a] == a) return a; // aはroot
	return (P[a] = root(P[a])); // a の親の root を求め,a の親とする
	
}

bool is_same_set(int a, int b) { // a と b が同じグループに属するか?
	return root(a) == root(b);
}

void unite(int a, int b) { // a と b を同一グループにまとめる
	P[root(a)] = root(b);
}

int main()
{
	while(cin >> N >> M && N){
		init(1001);
		for(int i=0; i<M; ++i)
		{
			cin >> A[i] >> B[i] >> COST[i];
			bridge[i].first = COST[i];
			bridge[i].second = i;
		}
		
		sort(bridge, bridge+M);
		for(int i=0; i<M; ++i)
		{
			int cost = bridge[i].first;
			int a = A[bridge[i].second];
			int b = B[bridge[i].second];
			//cout << a << "から" << b << "に" << cost << "コスト橋が架かっている" << endl;
		}
		
		int total = 0;
		for(int i=0; i<M; ++i)
		{
			int a = A[bridge[i].second];
			int b = B[bridge[i].second];
			if(is_same_set(a,b)) continue;
			unite(a,b);
			total += bridge[i].first;
		}
		cout << total << endl;
	}

}