#include using namespace std; class unionfind { vector par; public: unionfind(int n) { for (int i = 0; i < n; i++) { par.push_back(i); } } int find(int n) { if (par.at(n) == n) return n; return par.at(n) = find(par.at(n)); } void merge(int m, int n) { m = find(m); n = find(n); if (m == n) return; par.at(m) = n; } }; int main() { int n, m; cin >> n >> m; vector b(n), c(n); for (int i = 0; i < n; i++) { cin >> b.at(i) >> c.at(i); b.at(i)--; c.at(i)--; } vector> color(n); for (int i = 0; i < n; i++) { color.at(c.at(i)).push_back(b.at(i)); } unionfind t(m); for (int i = 0; i < n; i++) { for (int v : color.at(i)) { t.merge(v, color.at(i).at(0)); } } set s; for (int i = 0; i < m; i++) { s.insert(t.find(i)); } cout << m - s.size() << endl; }