# 写経元
# https://atcoder.jp/contests/abc126/submissions/5487745

class Node
  attr_accessor :parent
  def initialize(n)
    @parent = n
  end
end

class UnionFindTree
  attr_accessor :nodes#, :parents

  # 木の本数分, 自分自身を親として子を作成する.
  def initialize(n)
    @nodes = (1..n).to_a.map{|i| Node.new(i)}
  end

  # x に対応する1番上の親を返す.
  #   x-1 しているのは 1..n と index を揃えるため.
  def find(x)
    while @nodes[x-1].parent != x # x と xの親 が一致すれば1番上の親.
      x = @nodes[x-1].parent      # x と xの親 が一致しなければ, xを1つ上の親に置き換える.
    end
    #return  x = @nodes[x-1].parent
    return x
    #return x if x == @nodes[x-1].parent
    #return @nodes[x-1].parent = find(@nodes[x-1].parent)
  end

  # 親が一致しない場合, bの親をaの1番上の親に置き換える.
  def union(a, b)
    return if find(a) == find(b) # 1番上の親が一致すれば終了.
    $ans -= 1
    return @nodes[find(b)-1].parent = find(a) # bの親をaの1番上の親に置き換えて終了
  end

  #
  #def parents
  #  @nodes.map(&:parent)
  #end

end

n, m = gets.rstrip.split.map(&:to_i)
tree = UnionFindTree.new(n)

$ans = n
m.times do
  x, y, _ = gets.split.map(&:to_i)
  tree.union(x, y)
end

p $ans