import sys
input = sys.stdin.readline

class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots())

N, M = map(int, input().split())
uf = UnionFind(N+1)
for _ in range(M):
  x, y, z = map(int, input().split())
  uf.Unite(x, y)

roots = {i:0 for i in range(1, N+1)}
for i in range(1, N+1):
  r = uf.Find_Root(i)
  roots[r] += 1 

ans = 0
for v in roots.values():
  if v > 0:
    ans += 1
print(ans) import sys sys input = sys.stdin.readline input sys.stdin.readline sys.stdin sys stdin readline class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) UnionFind def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
   __init__ self.n = n self.n self n n self.root = [-1]*(n+1) self.root self root [-1]*(n+1) [-1] -1 n+1 n 1 self.rnk = [0]*(n+1) self.rnk self rnk [0]*(n+1) [0] 0 n+1 n 1 self self n n def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
   Find_Root if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
   self.root[x] < 0 self.root[x] self.root self root x 0 return x x self.root[x] = self.Find_Root(self.root[x]) self.root[x] self.root self root x self.Find_Root(self.root[x]) self.Find_Root self Find_Root self.root[x] self.root self root x return self.root[x] self.root[x] self.root self root x self self x x def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
   Unite x = self.Find_Root(x) x self.Find_Root(x) self.Find_Root self Find_Root x y = self.Find_Root(y) y self.Find_Root(y) self.Find_Root self Find_Root y if(x == y):
      return 
     x == y x y return if self.root[x] > self.root[y]:
      x, y = y, x
     self.root[x] > self.root[y] self.root[x] self.root self root x self.root[y] self.root self root y x, y = y, x x y y x self.root[x] += self.root[y] self.root[x] self.root self root x self.root[y] self.root self root y self.root[y] = x self.root[y] self.root self root y x self self x x y y def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
   isSameGroup return self.Find_Root(x) == self.Find_Root(y) self.Find_Root(x) == self.Find_Root(y) self.Find_Root(x) self.Find_Root self Find_Root x self.Find_Root(y) self.Find_Root self Find_Root y self self x x y y def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
   Count return -self.root[self.Find_Root(x)] -self.root[self.Find_Root(x)] self.root[self.Find_Root(x)] self.root self root self.Find_Root(x) self.Find_Root self Find_Root x self self x x def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
   Members i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x) for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x) i range(self.n) range self.n self n self.Find_Root(i)==self.Find_Root(x) self.Find_Root(i) self.Find_Root self Find_Root i self.Find_Root(x) self.Find_Root self Find_Root x if self.Find_Root(i)==self.Find_Root(x) i return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)] [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)] self self x x def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
   Roots i for i, x in enumerate(self.root) if x < 0 for i, x in enumerate(self.root) if x < 0 i x enumerate(self.root) enumerate self.root self root x < 0 x 0 if x < 0 i return [i for i, x in enumerate(self.root) if x < 0] [i for i, x in enumerate(self.root) if x < 0] self self def Group_Count(self): # グループの数を返す
    return len(self.Roots()) Group_Count return len(self.Roots()) len(self.Roots()) len self.Roots() self.Roots self Roots self self N, M = map(int, input().split()) N map(int, input().split()) map int input().split() ().split () input split M uf = UnionFind(N+1) uf UnionFind(N+1) UnionFind N+1 N 1 for _ in range(M):
  x, y, z = map(int, input().split())
  uf.Unite(x, y) _ range(M) range M x, y, z = map(int, input().split()) x map(int, input().split()) map int input().split() ().split () input split y z uf.Unite(x, y) uf.Unite uf Unite x y i:0 for i in range(1, N+1) for i in range(1, N+1) i range(1, N+1) range 1 N+1 N 1 for i in range(1, N+1) i 0 roots = {i:0 for i in range(1, N+1)} roots {i:0 for i in range(1, N+1)} for i in range(1, N+1):
  r = uf.Find_Root(i)
  roots[r] += 1  i range(1, N+1) range 1 N+1 N 1 r = uf.Find_Root(i) r uf.Find_Root(i) uf.Find_Root uf Find_Root i roots[r] += 1 roots[r] roots r 1 ans = 0 ans 0 for v in roots.values():
  if v > 0:
    ans += 1 v roots.values() roots.values roots values if v > 0:
    ans += 1 v > 0 v 0 ans += 1 ans 1 print(ans) print ans roots = {i:0 for i in range(1, N+1)} {i:0 for i in range(1, N+1)} roots M = map(int, input().split()) map(int, input().split()) M y, z = map(int, input().split()) map(int, input().split()) y N, M = map(int, input().split()) map(int, input().split()) N ans = 0 0 ans z = map(int, input().split()) map(int, input().split()) z class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots()) UnionFind uf = UnionFind(N+1) UnionFind(N+1) uf r = uf.Find_Root(i) uf.Find_Root(i) r ans += 1 1 ans input = sys.stdin.readline sys.stdin.readline input x, y, z = map(int, input().split()) map(int, input().split()) x
import sys
input = sys.stdin.readline

class UnionFind():
  def __init__(self, n):
    self.n = n
    self.root = [-1]*(n+1)
    self.rnk = [0]*(n+1)
  def Find_Root(self, x):
    if(self.root[x] < 0):
      return x
    else:
      self.root[x] = self.Find_Root(self.root[x])
      return self.root[x]
  def Unite(self, x, y):
    x = self.Find_Root(x)
    y = self.Find_Root(y)
    if(x == y):
      return 
    if self.root[x] > self.root[y]:
      x, y = y, x
    self.root[x] += self.root[y]
    self.root[y] = x 
  def isSameGroup(self, x, y):
    return self.Find_Root(x) == self.Find_Root(y)
  def Count(self, x): # xが属するグループのサイズを返す
    return -self.root[self.Find_Root(x)]
  def Members(self, x): # xが属するグループに属する要素をリストで返す
    return [i for i in range(self.n) if self.Find_Root(i)==self.Find_Root(x)]
  def Roots(self): # 全ての根の要素をリストで返す
    return [i for i, x in enumerate(self.root) if x < 0]
  def Group_Count(self): # グループの数を返す
    return len(self.Roots())

N, M = map(int, input().split())
uf = UnionFind(N+1)
for _ in range(M):
  x, y, z = map(int, input().split())
  uf.Unite(x, y)

roots = {i:0 for i in range(1, N+1)}
for i in range(1, N+1):
  r = uf.Find_Root(i)
  roots[r] += 1 

ans = 0
for v in roots.values():
  if v > 0:
    ans += 1
print(ans)