package test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.StringTokenizer;
public class BaekJoonQ11724_P148_Q23 {
static ArrayList<Integer>[] list;
static boolean[] visit;
private static void dfs(int crnt) {
if(visit[crnt]) {
return ;
}
else {
visit[crnt] = true;
for(int next:list[crnt]) {
if(!visit[next])
dfs(next);
}
}
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw =new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st =new StringTokenizer(br.readLine());
int node = Integer.parseInt(st.nextToken());
int edge = Integer.parseInt(st.nextToken());
visit =new boolean[node+1];
int count =0;
list =new ArrayList[node+1];
for(int i=1;i<list.length;i++) {
list[i] = new ArrayList<>();
}
for(int i=0;i<edge;i++) {
st =new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b= Integer.parseInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
for(int i=1;i<list.length;i++) {
if(!visit[i]) {
++count;
dfs(i);
}
}
bw.write(Integer.toString(count));
bw.flush();
}
}