#include <iostream>
#include <cstring>
using namespace std;
int path[1001][1001];
int visited[1001];
int n,m;
//将與x相連的節點都标記為已通路
void dfs(int x){
visited[x] = 1; //标記x已通路的位置要正确,要先處理x已通路,不然會漏了一種情況
for(int i=1;i<=n;i++){
if(!visited[i] && path[x][i] == 1){
//visited[i] = 1;
dfs(i);
}
}
}
int main(){
memset(path,0,sizeof(path));
memset(visited,0,sizeof(visited));
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
path[a][b] = 1;
path[b][a] = 1;
}
int block = 0;
//遇到未通路的節點,block就加一,然後将與該節點相連的所有節點都标記為通路過
//Attention!!!!!!!!一定要注意節點的下标是從1開始的!!!!
for(int i=1;i<=n;i++){
if(visited[i] == 0){
block++;
dfs(i);
}
}
cout<<block<<endl;
return 0;
}