1) bfs
2) dfs
import java.util.*;
import java.io.*;
public class BOJ2606 {
static List<Integer>[] nodeList;
static boolean[] visited;
static int answer = 0;
static Queue<Integer> queue = new LinkedList<>();
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int M = Integer.parseInt(br.readLine());
nodeList = new ArrayList[N];
for (int i = 0; i < N; i++) {
nodeList[i] = new ArrayList<>();
}
visited = new boolean[N];
StringTokenizer st;
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken())-1;
int B = Integer.parseInt(st.nextToken())-1;
nodeList[A].add(B);
nodeList[B].add(A);
}
// bfs(0);
dfs(0);
System.out.println(answer);
}
private static void dfs(int i) {
visited[i] = true;
for (int next : nodeList[i]) {
if (!visited[next])
{
answer++;
dfs(next);
}
}
}
private static void bfs(int i) {
visited[i] = true;
queue.add(i);
while (!queue.isEmpty()) {
int cur = queue.poll();
for (int next : nodeList[cur]) {
if (!visited[next]) {
visited[next] = true;
queue.add(next);
answer++;
}
}
}
}
}