n,m=map(int,input().split())

import sys
sys.setrecursionlimit(10**9) #再帰の上限をあげる

root=[i for i in range(n+1)] #自分が親なら自身の番号を、そうでないなら（元）親の番号を示す

def r(x):   #親は誰？
    if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x]

def unite(x,y):
    x=r(x)
    y=r(y)
    if x==y:
        return
    if x>y:
        x,y=y,x
    root[y]=x

for i in range(m):
    x,y,z=map(int,input().split())
    unite(x,y)

ans=0
for i in range(1,n+1):
    if root[i]==i:
        ans+=1
print(ans)

 n,m=map(int,input().split()) n map(int,input().split()) map int input().split() ().split () input split m import sys sys sys.setrecursionlimit(10**9) sys.setrecursionlimit sys setrecursionlimit 10**9 10 9 i for i in range(n+1) for i in range(n+1) i range(n+1) range n+1 n 1 for i in range(n+1) i root=[i for i in range(n+1)] root [i for i in range(n+1)] def r(x):   #親は誰？
    if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x] r if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x] root[x]==x root[x] root x x return x x root[x]=r(root[x]) root[x] root x r(root[x]) r root[x] root x return root[x] root[x] root x x x def unite(x,y):
    x=r(x)
    y=r(y)
    if x==y:
        return
    if x>y:
        x,y=y,x
    root[y]=x unite x=r(x) x r(x) r x y=r(y) y r(y) r y if x==y:
        return
     x==y x y return if x>y:
        x,y=y,x
     x>y x y x,y=y,x x y y x root[y]=x root[y] root y x x x y y for i in range(m):
    x,y,z=map(int,input().split())
    unite(x,y) i 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 unite(x,y) unite x y ans=0 ans 0 for i in range(1,n+1):
    if root[i]==i:
        ans+=1 i range(1,n+1) range 1 n+1 n 1 if root[i]==i:
        ans+=1 root[i]==i root[i] root i i ans+=1 ans 1 print(ans) print ans y,z=map(int,input().split()) map(int,input().split()) y m=map(int,input().split()) map(int,input().split()) m root=[i for i in range(n+1)] [i for i in range(n+1)] root ans=0 0 ans z=map(int,input().split()) map(int,input().split()) z ans+=1 1 ans def unite(x,y):
    x=r(x)
    y=r(y)
    if x==y:
        return
    if x>y:
        x,y=y,x
    root[y]=x def unite(x,y):
    x=r(x)
    y=r(y)
    if x==y:
        return
    if x>y:
        x,y=y,x
    root[y]=x unite n,m=map(int,input().split()) map(int,input().split()) n x,y,z=map(int,input().split()) map(int,input().split()) x def r(x):   #親は誰？
    if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x] def r(x):   #親は誰？
    if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x] r
n,m=map(int,input().split())

import sys
sys.setrecursionlimit(10**9) #再帰の上限をあげる

root=[i for i in range(n+1)] #自分が親なら自身の番号を、そうでないなら（元）親の番号を示す

def r(x):   #親は誰？
    if root[x]==x:
        return x
    else:
        root[x]=r(root[x])
        return root[x]

def unite(x,y):
    x=r(x)
    y=r(y)
    if x==y:
        return
    if x>y:
        x,y=y,x
    root[y]=x

for i in range(m):
    x,y,z=map(int,input().split())
    unite(x,y)

ans=0
for i in range(1,n+1):
    if root[i]==i:
        ans+=1
print(ans)


