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

struct UF {
  vector<int> p;
  UF(int n) : p(n,-1) {}
  int rt(int x) { return p[x]<0 ? x : p[x]=rt(p[x]); }
  bool cat(int x, int y) {
    x=rt(x); y=rt(y);
    if(x==y) return false;
    if(p[x]<p[y]) swap(x,y);
    p[y]+=p[x];
    p[x]=y;
    return true;
  }
};

int main() {
  for(int tci = 0; ; tci++) {
    int n,m; scanf("%d%d", &n, &m);
    if(n==0) break;
    vector<pair<int,pair<int,int> > > edges(m);
    for(int i = 0; i < m; i++) {
      int a,b,c; scanf("%d%d%d", &a, &b, &c);
      edges[i] = make_pair(c,make_pair(a,b));
    }
    sort(edges.begin(), edges.end());
    UF uf(n);
    long long cost_sum = 0;
    for(int i = 0; i < m; i++) {
      if(uf.cat(edges[i].second.first, edges[i].second.second)) {
        cost_sum += edges[i].first;
      }
    }
    printf("%lld\n", cost_sum);
  }
  return 0;
}