import java.io.*;
import java.util.*;
public class TreeDP {
static int N;
static List<Integer>[] g;
static int[][] dp;
static boolean[] visited;
// 예시: 트리 독립집합 (dp[u][0] = 선택X, dp[u][1] = 선택O)
static void dfs(int u) {
visited[u] = true;
dp[u][0] = 0;
dp[u][1] = 1; // 자기 자신 선택
for (int v : g[u]) {
if (!visited[v]) {
dfs(v);
dp[u][0] += Math.max(dp[v][0], dp[v][1]); // u 선택X → v 자유
dp[u][1] += dp[v][0]; // u 선택O → v는 선택 불가
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
g = new ArrayList[N+1];
dp = new int[N+1][2];
visited = new boolean[N+1];
for (int i = 1; i <= N; i++) g[i] = new ArrayList<>();
// 간선 입력
for (int i = 0; i < N-1; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
g[a].add(b);
g[b].add(a);
}
dfs(1); // 1번을 루트로 DFS
System.out.println(Math.max(dp[1][0], dp[1][1])); // 전체 최댓값
}
}