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

struct edge { int u, v, cost; };
bool comp(const edge& e1, const edge& e2){
  return e1.cost < e2.cost;
}
int par[100];
int rank[100];

void init_union_find(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]);
  }
}

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);
}




int n,m;
edge es[10000];
int V,E;

int kruskal(){
  sort (es,es + m, comp);
  init_union_find(n);
  int res = 0;
  for(int i=0;i<m;i++){
    edge e = es[i];
    if(!same(e.u,e.v)){
      unite(e.u,e.v);
      res+=e.cost;
    }
  }
  return res;
}

int main(){
  while(cin>>n>>m){
    if(n==0&&m==0)break;
    for(int i=0;i<m;i++){
      cin>>es[i].u>>es[i].v>>es[i].cost;
    }
    cout<<kruskal()<<endl;
  }
  
  return 0;
}