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

int N = 10010;
int M,A[10010],B[10010],COST[10010];
pair<int,int> bridge[10010]; //コストと橋番号のペア
int P[10010]; //0から10000までの取り扱い可能
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>0)){
 //(NとMを読み込み,Nが0より大きければ処理する)
    init(N);
	int sum = 0;
    for (int i=0; i<M; ++i) {
	  //A[i]とB[i]とCOST[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];
	//「aからbにcostの橋がかかっている」と表示
	for (int i=0; i<M; ++i){ //安い橋から順に
	if (!is_same_set(a,b)){ //(端の両端の節点が既に連結だったら)
	//端の両端の節点を同一グループに併合する
	unite (a,b);
	//合計に,橋のコストを加える
	sum += cost;
	  }
	 }
	}
	//合計を出力
	cout << sum << endl;
 }
}