def find(x): #要素がどの集合か判断
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]

def unite(x,y): #集合に結合
    x = find(x)
    y = find(y)
    if x == y: return False
    if par[x] > par[y]: x,y = y,x
    par[x] += par[y]
    par[y] = x
    return True

import bisect
n, m = map(int, input().split())
par = [-1]*n

for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x-1, y-1)
par.sort()
print(bisect.bisect_left(par, 0)) def find(x): #要素がどの集合か判断
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x] find if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x] par[x] < 0 par[x] par x 0 return x x par[x] = find(par[x]) par[x] par x find(par[x]) find par[x] par x return par[x] par[x] par x x x def unite(x,y): #集合に結合
    x = find(x)
    y = find(y)
    if x == y: return False
    if par[x] > par[y]: x,y = y,x
    par[x] += par[y]
    par[y] = x
    return True unite x = find(x) x find(x) find x y = find(y) y find(y) find y if x == y: return False
     x == y x y if par[x] > par[y]: x,y = y,x
     par[x] > par[y] par[x] par x par[y] par y par[x] += par[y] par[x] par x par[y] par y par[y] = x par[y] par y x return True True x x y y import bisect bisect n, m = map(int, input().split()) n map(int, input().split()) map int input().split() ().split () input split m par = [-1]*n par [-1]*n [-1] -1 n for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x-1, y-1) _ 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-1, y-1) unite x-1 x 1 y-1 y 1 par.sort() par.sort par sort print(bisect.bisect_left(par, 0)) print bisect.bisect_left(par, 0) bisect.bisect_left bisect bisect_left par 0 def find(x): #要素がどの集合か判断
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x] def find(x): #要素がどの集合か判断
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x] find n, m = map(int, input().split()) map(int, input().split()) n par = [-1]*n [-1]*n par def unite(x,y): #集合に結合
    x = find(x)
    y = find(y)
    if x == y: return False
    if par[x] > par[y]: x,y = y,x
    par[x] += par[y]
    par[y] = x
    return True def unite(x,y): #集合に結合
    x = find(x)
    y = find(y)
    if x == y: return False
    if par[x] > par[y]: x,y = y,x
    par[x] += par[y]
    par[y] = x
    return True unite m = map(int, input().split()) map(int, input().split()) m x, y, z = map(int, input().split()) map(int, input().split()) x y, z = map(int, input().split()) map(int, input().split()) y z = map(int, input().split()) map(int, input().split()) z
def find(x): #要素がどの集合か判断
    if par[x] < 0:
        return x
    else:
        par[x] = find(par[x])
        return par[x]

def unite(x,y): #集合に結合
    x = find(x)
    y = find(y)
    if x == y: return False
    if par[x] > par[y]: x,y = y,x
    par[x] += par[y]
    par[y] = x
    return True

import bisect
n, m = map(int, input().split())
par = [-1]*n

for _ in range(m):
    x, y, z = map(int, input().split())
    unite(x-1, y-1)
par.sort()
print(bisect.bisect_left(par, 0))