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

#define FOR(i,a) for(int i=0;i<(int)(a);i++)
#define pb push_back
#define clr clear()
#define sz size()
typedef unsigned int ui;

class node{
public:
  int num;
  void set(int n){
    num = n;
  }
};

class edge{
public:
  node b,e;
  int cost;
  void set(int s,int g,int c){
    b.set(s);
    e.set(g);
    cost = c;
  }
};

class graph{
public:
  vector<node> n;
  vector<edge> e;

  void set(void){
    n.clr;
    e.clr;
  }

  void Nadd(node a){
    if(!n.sz)n.pb(a);
    else{
      ui i = 0;
      while(n[i].num < a.num && i<n.sz)i++;
      n.insert(n.begin()+i,a);
    }
  }

  void Eadd(edge a){
    if(!e.sz)e.pb(a);
    else{
      ui i = 0;
      while(e[i].cost < a.cost && i<e.sz)i++;
      e.insert(e.begin()+i,a);
    }
  }

  bool Nexist(node a){
    FOR(i,n.sz){
      if(a.num == n[i].num)return true;
    }
    return false;
  }

  graph prim(void){
    graph res;

    res.set();

    if(!e.sz)return res;
    else{
      res.Eadd(e[0]);
      res.Nadd(e[0].b);
      res.Nadd(e[0].e);

      while(res.n.sz < n.sz){
	FOR(i,e.sz){
	  if(res.Nexist(e[i].b) && !res.Nexist(e[i].e)){
	    res.Eadd(e[i]);
	    res.Nadd(e[i].e);
	    i = 0;
	  }else if(!res.Nexist(e[i].b) && res.Nexist(e[i].e) ){
	    res.Eadd(e[i]);
	    res.Nadd(e[i].b);
	    i = 0;
	  }
	}
      }
      return res;
    }
  }
};

int main(){
  int n,m,ans;
  int a,b,c;
  graph g,p;
  node tmp;
  edge etmp;

  while(1){
    cin >> n >> m;
    if(!n && !m)break;

    g.set();
    for(int i=0;i<n;i++){
      tmp.set(i);
      g.Nadd(tmp);
    }
    for(int i=0;i<m;i++){
      cin >> a >> b >> c;
      etmp.set(a,b,c);
      g.Eadd(etmp);
    }

    p = g.prim();

    ans = 0;
    for(int i=0;i<p.e.size();i++)ans += p.e[i].cost;
    cout << ans << endl;
  }
}