# import sys

# import math #sqrt,gcd,pi

# import decimal

import queue # queue

import bisect

# import heapq # priolity-queue

# from time import time

# from itertools import product,permutations,\

    # combinations,combinations_with_replacement

# 重複あり順列、順列、組み合わせ、重複あり組み合わせ

# import collections # deque

# from operator import itemgetter,mul

# from fractions import Fraction

# from functools import reduce



mod = int(1e9+7)

# mod = 998244353

INF = 1<<50



def readInt():

    return list(map(int,input().split()))



def main():

    n,m = readInt()

    road = [[] for i in range(n)]

    for i in range(m):

        a,b = readInt()

        road[a-1].append(b-1)

        road[b-1].append(a-1)

    ans = 0

    city = set(i for i in range(n))

    while len(city):

        q = queue.Queue()

        q.put(city.pop())

        visit = set()

        while not q.empty():

            x = q.get()

            visit.add(x)

            for i in road[x]:

                if i not in visit:

                    q.put(i)

                    city.discard(i)

        if len(city):

            ans += 1

    print(ans)

    return



if __name__=='__main__':

    main()

# queueのライブラリをインポート

import queue



n,m = list(map(int,input().split()))

# 各都市から繋がっている都市を記録

road = [[] for i in range(n)]

for i in range(m):

  a,b = list(map(int,input().split()))

  road[a-1].append(b-1)

  road[b-1].append(a-1)

ans = 0

# まだ訪れていない都市を記録

city = set(i for i in range(n))

# まだ訪れていない都市がある間繰り返す

while len(city):

  # queueを用意する

  q = queue.Queue()

  # 初期値としてまだ訪れていない都市を入れる

  q.put(city.pop())

  # 1つのグループを全て辿る

  while not q.empty():

    x = q.get()

    for i in road[x]:

      # 既に訪れたか調べる

      if i in city:

        # 訪れていなければqueueに追加する

        q.put(i)

        # 未訪問の都市のリストから除外する

        city.discard(i)

  # まだ訪れていない都市があれば答えを増やす

  if len(city):

    ans += 1

print(ans)
# import sys
# import math #sqrt,gcd,pi
# import decimal
import queue  # queue
import bisect

# import heapq # priolity-queue
# from time import time
# from itertools import product,permutations,\
# combinations,combinations_with_replacement
# 重複あり順列、順列、組み合わせ、重複あり組み合わせ
# import collections # deque
# from operator import itemgetter,mul
# from fractions import Fraction
# from functools import reduce
mod = int(1e9 + 7)
# mod = 998244353
INF = 1 << 50


def readInt():
    return list(map(int, input().split()))


def main():
    n, m = readInt()
    road = [[] for i in range(n)]
    for i in range(m):
        a, b = readInt()
        road[a - 1].append(b - 1)
        road[b - 1].append(a - 1)
    ans = 0
    city = set(i for i in range(n))
    while len(city):
        q = queue.Queue()
        q.put(city.pop())
        visit = set()
        while not q.empty():
            x = q.get()
            visit.add(x)
            for i in road[x]:
                if i not in visit:
                    q.put(i)
                    city.discard(i)
        if len(city):
            ans += 1
    print(ans)
    return


if __name__ == "__main__":
    main()

# queueのライブラリをインポート
import queue

n, m = list(map(int, input().split()))
# 各都市から繋がっている都市を記録
road = [[] for i in range(n)]
for i in range(m):
    a, b = list(map(int, input().split()))
    road[a - 1].append(b - 1)
    road[b - 1].append(a - 1)
ans = 0
# まだ訪れていない都市を記録
city = set(i for i in range(n))
# まだ訪れていない都市がある間繰り返す
while len(city):
    # queueを用意する
    q = queue.Queue()
    # 初期値としてまだ訪れていない都市を入れる
    q.put(city.pop())
    # 1つのグループを全て辿る
    while not q.empty():
        x = q.get()
        for i in road[x]:
            # 既に訪れたか調べる
            if i in city:
                # 訪れていなければqueueに追加する
                q.put(i)
                # 未訪問の都市のリストから除外する
                city.discard(i)
    # まだ訪れていない都市があれば答えを増やす
    if len(city):
        ans += 1
print(ans)

-# import sys -# import math #sqrt,gcd,pi -# import decimal -import queue  # queue -import bisect +# queueのライブラリをインポート +import queue -# import heapq # priolity-queue -# from time import time -# from itertools import product,permutations,\ -# combinations,combinations_with_replacement -# 重複あり順列、順列、組み合わせ、重複あり組み合わせ -# import collections # deque -# from operator import itemgetter,mul -# from fractions import Fraction -# from functools import reduce -mod = int(1e9 + 7) -# mod = 998244353 -INF = 1 << 50 - - -def readInt(): -    return list(map(int, input().split())) - - -def main(): -    n, m = readInt() -    road = [[] for i in range(n)] -    for i in range(m): -        a, b = readInt() -        road[a - 1].append(b - 1) -        road[b - 1].append(a - 1) -    ans = 0 -    city = set(i for i in range(n)) -    while len(city): -        q = queue.Queue() -        q.put(city.pop()) -        visit = set() -        while not q.empty(): -            x = q.get() -            visit.add(x) -            for i in road[x]: -                if i not in visit: -                    q.put(i) -                    city.discard(i) -        if len(city): -            ans += 1 -    print(ans) -    return - - -if __name__ == "__main__": -    main() +n, m = list(map(int, input().split())) +# 各都市から繋がっている都市を記録 +road = [[] for i in range(n)] +for i in range(m): +    a, b = list(map(int, input().split())) +    road[a - 1].append(b - 1) +    road[b - 1].append(a - 1) +ans = 0 +# まだ訪れていない都市を記録 +city = set(i for i in range(n)) +# まだ訪れていない都市がある間繰り返す +while len(city): +    # queueを用意する +    q = queue.Queue() +    # 初期値としてまだ訪れていない都市を入れる +    q.put(city.pop()) +    # 1つのグループを全て辿る +    while not q.empty(): +        x = q.get() +        for i in road[x]: +            # 既に訪れたか調べる +            if i in city: +                # 訪れていなければqueueに追加する +                q.put(i) +                # 未訪問の都市のリストから除外する +                city.discard(i) +    # まだ訪れていない都市があれば答えを増やす +    if len(city): +        ans += 1 +print(ans)