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

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

        elif self.rnk[x]>self.rnk[y]:

            self.root[x]+=self.root[y]

            self.root[y]=x

        else:

            self.root[y]+=self.root[x]

            self.root[x]=y

            if self.rnk[x]==self.rnk[y]:

                self.rnk[y]+=1



    def isSameGroup(self,x,y):

        return self.Find_Root(x)==self.Find_Root(y)



    def Count(self,x):

        return -self.root[self.Find_Root(x)]



uf=UnionFind(n)

for _ in range(m):

    x,y,z=list(map(int,input().split()))

    uf.Unite(x,y)

ans=set()

for i in range(1,n+1):

    ans.add(uf.Find_Root(i))

print((len(ans)))

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

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

        elif self.rnk[x]>self.rnk[y]:

            self.root[x]+=self.root[y]

            self.root[y]=x

        else:

            self.root[y]+=self.root[x]

            self.root[x]=y

            if self.rnk[x]==self.rnk[y]:

                self.rnk[y]+=1



    def isSameGroup(self,x,y):

        return self.Find_Root(x)==self.Find_Root(y)



    def Count(self,x):

        return -self.root[self.Find_Root(x)]



uf=UnionFind(n)

for _ in range(m):

    x,y,z=list(map(int,input().split()))

    x-=1

    y-=1

    uf.Unite(x,y)

r=[0]*n

for i in range(n):

    r[i]=uf.Find_Root(i)

s=set(r)

print((len(s)))

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


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
        elif self.rnk[x] > self.rnk[y]:
            self.root[x] += self.root[y]
            self.root[y] = x
        else:
            self.root[y] += self.root[x]
            self.root[x] = y
            if self.rnk[x] == self.rnk[y]:
                self.rnk[y] += 1

    def isSameGroup(self, x, y):
        return self.Find_Root(x) == self.Find_Root(y)

    def Count(self, x):
        return -self.root[self.Find_Root(x)]


uf = UnionFind(n)
for _ in range(m):
    x, y, z = list(map(int, input().split()))
    uf.Unite(x, y)
ans = set()
for i in range(1, n + 1):
    ans.add(uf.Find_Root(i))
print((len(ans)))

n, m = list(map(int, input().split()))
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
        elif self.rnk[x] > self.rnk[y]:
            self.root[x] += self.root[y]
            self.root[y] = x
        else:
            self.root[y] += self.root[x]
            self.root[x] = y
            if self.rnk[x] == self.rnk[y]:
                self.rnk[y] += 1

    def isSameGroup(self, x, y):
        return self.Find_Root(x) == self.Find_Root(y)

    def Count(self, x):
        return -self.root[self.Find_Root(x)]


uf = UnionFind(n)
for _ in range(m):
    x, y, z = list(map(int, input().split()))
    x -= 1
    y -= 1
    uf.Unite(x, y)
r = [0] * n
for i in range(n):
    r[i] = uf.Find_Root(i)
s = set(r)
print((len(s)))

+import sys + +input = sys.stdin.readline +    x -= 1 +    y -= 1 -ans = set() -for i in range(1, n + 1): -    ans.add(uf.Find_Root(i)) -print((len(ans))) +r = [0] * n +for i in range(n): +    r[i] = uf.Find_Root(i) +s = set(r) +print((len(s)))