import sys
sys.setrecursionlimit(10000)
input = sys.stdin.readline
n,m = map(int, input().split())
#_를 쓰는 이유: i에 관해 반복한다? 할 때 그 인덱스의 의미가 없고, 반복 횟수 만이 의미가 있을 때
A = [[] for _ in range(n+1)] #N개의 노드만큼의 인접 리스트를 만들어 둔다.
visited = [False] * (n+1) #방문리스트 n개 또한 만들어 둔다.
def DFS(v): # DFS(깊이우선탐색) 함수 정의
visited[v] = True # 방문리스트 값이 True면 반환, False면 DFS 재귀함수 호출
for i in A[v]:
if not visited[i]:
DFS(i)
for _ in range(m):
s,e = map(int, input().split()) # m개의 양 끝점을 읽는다.
A[s].append(e) # 인접리스트의 s번째 칸에 연결된 것들 넣어준다.
A[e].append(s) # 방향이 상관없으므로 e칸에도 넣어준다.
count = 0
for i in range(1, n+1): # DFS가 한 번 끝날 때 마다 연결요소 개수 1 증가
if not visited[i]:
count += 1
DFS(i)
print(count)