#include <iostream>

using namespace std;

int father[1000010];
int height[1000010];
bool visit[1000010];

void Init() {
    for (int i = 0; i < 1000010; i++) {
        father[i] = i;
        height[i] = 0;
        visit[i] = false;
    }
}

int Find(int x) {
    if (x != father[x]) {
        father[x] = Find(father[x]);
    }
    return father[x];
}

void Union(int x, int y) {
    x = Find(x);
    y = Find(y);
    if (x != y) {
        if (height[x] < height[y]) {
            father[x] = y;
        } else if (height[x] > height[y]) {
            father[y] = x;
        } else {
            father[y] = x;
            height[x]++;
        }
    }

}

int main() {
    Init();
    int x, y;
    int MaxNum = 0;
    while (scanf("%d%d", &x, &y) != EOF) {
        Union(x, y);
        visit[x] = true;
        visit[y] = true;
        MaxNum = MaxNum > x ? MaxNum : x;//为了缩小下面的遍历范围 保留这一个文件中最大编号的节点
        MaxNum = MaxNum > y ? MaxNum : y;
    }
    int component = 0;
    for (int i = 1; i <= MaxNum; i++) {
        if (!visit[i])
            continue;
        if (father[i] == i)
            component++;
    }
    printf("%d\n",component);
    return 0;
}