Problem:
橋の取り壊し

水の国ウォーターデブンには n 個の都市があります。各都市は水に囲まれており、島国のようになっています。ウォーターデブンには m 本の橋があり、都市間の交通はそれらの橋によって行われ、全ての都市に行き来することができます。

最近、道路特定財源の見直しにより橋の維持費の削減が決定されました。全部の橋を維持することができなくなってしまい、いくつかの橋を取り壊すことになりました。そこで、ウォーターデブンはどの都市にでも行くことができるように橋を残しつつ、橋の維持費を最小化することが課題となりました。

都市の数、橋の数、各橋の維持費を入力とし、橋を利用してどの都市にも行けるようにしつつ、橋を取り壊した場合の維持費の最小値を出力するプログラムを作成してください。なお、橋の取り壊しには費用が掛からないものとします。ただし、各都市は 0 から n - 1 まで順番に番号が付けられているものとします。

Input

複数のデータセットの並びが入力として与えられます。入力の終わりはゼロふたつの行で示されます。各データセットは以下の形式で与えられます。

n m
a1 b1 cost1
a2 b2 cost2
:
am bm costm

１行目に都市の数 n (2 ≤ n ≤ 100)、 橋の数 m (1 ≤ m ≤ 500) が与えられます。続く m 行に第 i の橋の情報が与えられます。ai, bi は橋がつないでいる都市の番号、costi (1 ≤ costi ≤ 1000) は橋にかかる維持費を表します。

Output

データセット毎に橋の維持費の合計を１行に出力します。

Sample Input

5 6
0 2 1
2 1 3
2 3 8
1 3 2
3 4 5
1 4 4
3 3
1 2 3
2 0 3
0 1 3
0 0

Output for the Sample Input

10
6

Solution in Ruby (judge verdict: Accepted)

Infinity = 1000000

def decreaseKey q, v, w
  q.size.times do |i|
    if q[i][0] == v
      q[i][1] = w
      break
    end
  end
end

def inQueue q, v
  q.size.times do |i|
    return true if q[i][0] == v
  end
  false
end

def prim graph
  n = graph.size
  key = Array.new(n, Infinity)
  key[0] = 0
  q = Array.new
  n.times do |i|
    q << [i, key[i]]
  end

  until q.empty?
    #最少のキー値を持つノードを取り出す
    u = -1
    min = Infinity
    q.size.times do |i|
      if q[i][1] < min
        min = q[i][1]
        u = q[i][0]
      end
    end
    q.size.times do |i|
      if q[i][0] == u
        q.delete_at(i)
        break
      end
    end

    #そのノードから接続しているすべてのノードについて、キー値を更新する
    n.times do |v|
      next if graph[u][v] == Infinity
      if inQueue(q, v)
        w = graph[u][v]
        #キー値を更新したら、キュー格納値のキーを更新
        if w < key[v]
          key[v] = w
          decreaseKey(q, v, w)
        end
      end
    end
  end
  key
end

loop do
  n,m = $stdin.gets.chomp.split(" ").map(&:to_i)
  break if (n|m) == 0
  graph = Array.new(n).map{Array.new(n, Infinity)}
  m.times do |i|
    a,b,cost = $stdin.gets.chomp.split(" ").map(&:to_i)
    graph[a][b] = cost
    graph[b][a] = cost
  end
  p prim(graph).inject(:+)
end