// union find
#include <bits/stdc++.h>
using namespace std;
const int N = 200000; // тогтмол хувьсагч
int n; // оройн тоо
int q; // хүсэлтийн тоо
int s[N]; // s[x] нь x гэсэн дээд эцэгтэй компонентийн хэмжээ
int comp; // нийт компонентийн тоо
int par[N]; // par[x] нь x оройн эцгийг хадгална.
int find(int x) { // x оройн дээд эцгийг олох функц
if(x == par[x]) { // x оройн эцэг өөрөө гэдэг нь хамгийн дээд орой мөн
return x; // тиймээс x оройг буцаана.
}
// эсрэг тохиолдолд
// par[x] оройн дээд эцэг нь x оройн дээд эцэг тул par[x] оройн
// дээд эцгийг олно.
int root = find( par[x] );
// root нь дээд эцэг бөгөөд
// x оройн эцгийг root гэж оноосноор холболтын урт багасна.
// ингэснээр бидэнд ашигтай.
par[x] = root;
return root;
}
int main() {
cin >> n; // оройн тоо
comp = n; // n ширхэг компонент байгаа.
for(int i = 1; i <= n; i++) {
par[i] = i; // i оройн эцэг нь өөрөө
s[i] = 1; // хэмжээ нь 1
}
cin >> q; // хүсэлтийн тоо
while(q--) {
int x, y; // холбох 2 орой
cin >> x >> y;
int rootX = find(x); // x оройн дээд эцгийг олно.
int rootY = find(y); // y оройн дээд эцгийг олно.
if(rootX == rootY) { // анхны 2 оройн дээд эцэг нь ижил гэдэг нь
// нэг компонентэд энэ 2 орой оршиж байна.
// тиймээс юу ч хийх шаардлагагүй.
} else { // эсрэг тохиолдолд нэгтгэх ёстой.
// 2 компонент нэгдэж байгаа тул нийт компонентийн тоо нэгээр хасагдана.
comp--;
if(s[rootX] > s[rootY]) { // хэмжээ ихэд нь хэмжээ багатай
// компонентийг холбоно.
par[rootY] = rootX; // rootY-н эцгийг rootX болгоно.
s[rootX] += s[rootY]; // rootX эцэгтэй компонентийн хэмжээ нь нэмэгдэнэ.
s[rootY] = 0;
} else {
par[rootX] = rootY; // rootX-н эцгийг rootY болгоно.
s[rootY] += s[rootX]; // rootY эцэгтэй компонентийн хэмжээ нь нэмэгдэнэ.
s[rootX] = 0;
}
}
cout << comp << endl;
}
return 0;
}