package Chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
public class hii {
static ArrayList<Integer>[] A;
static boolean visited[];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
A = new ArrayList[n+1];
visited = new boolean[n+1];
for (int i = 1; i <= n; i++) {
A[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++){
st = new StringTokenizer(bf.readLine());
int startNode = Integer.parseInt(st.nextToken());
int endNode = Integer.parseInt(st.nextToken());
A[startNode].add(endNode);
A[endNode].add(startNode);
}
int count = 0;
for (int i = 1; i <= n; i++) {
if(!visited[i]){
count++;
dfs(i);
}
}
System.out.println(count);
}
static void dfs(int now){
if(visited[now]) {return;}
visited[now] = true;
for (int i : A[now]) {
if(!visited[i]){
dfs(i);
}
}
}
}