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

using namespace std;

typedef vector< int > VI;
typedef vector< VI > VVI;

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

#define MAX_N 101
#define MAX_E 1000

int par[MAX_N];
int Rank[MAX_N];
edge map[MAX_E];

// nで初期化
void init( int n ) {
	for(int i = 0; i < n; i++) {
		par[i] = i;
		Rank[i] = 0;
	}
}

// 木の根を求める
int find( int x ) {
	if(par[x] == x) {
		return x;
	} else {
		return par[x] = find(par[x]);
	}
}

// xとyの属する集合を合併
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[x] = y;
		if( Rank[x] == Rank[y] ) {
			Rank[x]++;
		}
	}
}

// xとyが同じ集合に属するか否か
bool same( int x, int y ) {
	return find(x) == find(y);
}


bool comp( const edge& e1, const edge& e2) {
	return e1.cost < e2.cost;
}

int main() {
	int n, m;

	while( true ){
		cin >> n >> m;
		if(n == 0 && m == 0) {
			break;
		}

		int a, b, c;
		for(int i = 0; i < m; i++) {
			cin >> a >> b >> c;
			map[i].from = a;
			map[i].to = b;
			map[i].cost = c;
		}

		sort(map, map + m, comp);
		init(n);
		int res = 0;
		for(int i = 0; i < m; i++) {
			edge e = map[i];
			if(!same(e.from, e.to)) {
				unite(e.from, e.to);
				res += e.cost;
			}
		}

		cout << res << endl;
	}
}