// http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0180
// PCK2008yosen-08
// パソコン甲子園・・・チームrand()・・・うっ・・・高校時代も今もあいつらとは目を合わせないように生きてきたんだ・・・

#include <cstdio>
#include <algorithm>
using namespace std;

struct bridge {
	int a;
	int b;
	int cost;
	
	bool operator < ( const bridge& com ) const {
		return (this->cost < com.cost);
	};
};

int root[110];
bridge br[10010];

int getroot(int city) {
	if ( root[city] == city ) {
		return city;
	}
	root[city] = getroot(root[city]);
	return root[city];
}

int main(void) {
	
	while(true) {
		int n, m;
		scanf("%d %d", &n, &m);
		if ( n == 0 ) { return 0; }
		for(int i=0; i<m; i++) {
			scanf("%d %d %d", &br[i].a, &br[i].b, &br[i].cost);
		}
		
		sort(br, br+m);
		
		for(int i=0; i<n; i++) {
			root[i] = i;
		}
		
		int total = 0;
		for(int i=0; i<m; i++) {
			if ( getroot(br[i].a) == getroot(br[i].b) ) { continue; }
			
			// 橋を追加
			total += br[i].cost;
			int ra = getroot(br[i].a);
			int rb = getroot(br[i].b);
			root[ra] = rb;
			
			int j;
			for(j=1; j<n; j++) {
				if (getroot(j) != getroot(0)) {
					break;
				}
			}
			/*
			for(int aa=0; aa<n; aa++) {
				printf("%d ", root[aa]);
			}
			printf("\n");
			*/
			if ( j == n ) { break; }
		}
		
		printf("%d\n", total);
	}

}