// #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
// 思路来自其它题解,建议找到题解中阅读量最高的哪个读一遍,然后对照着敲先全局,再main遇到自定义函数时可以先把main敲完也可以跳到自定义函数部分
// 因为n个点n-1个边且互相连通所以不会有环
#include <iostream>
#include <vector>
using namespace std;
int dp[500001][2];
vector<int> G[500001];//--------用于建立邻接表
void dfs(int cur, int pre){//----------我是跟着原题解敲的,那里就叫dfs虽然我也不懂
for (int i = 0; i < G[cur].size();i++){//-----遍历子树,树状dp
int next = G[cur][i];
if (next == pre) continue;//-------pre是当前节点的父节点,不能往回走成死循环
dfs(next, cur);//--------调用函数计算子树的值
dp[cur][0] += max(dp[next][1], dp[next][0]);//------状态转移,如果当前点没被选择,则其子节点选不选都可以
dp[cur][1] += dp[next][0];//---------如果当前点被选择,则其子节点必然不能被选择
}
}
int main(){
int n, s;
cin >> n >> s;
for (int i = 1; i <= n; i++) dp[i][1] = 1;//--------对最小单位进行初始化
for (int i = 1; i < n; i++){
int u, v;
cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
dfs(s, -1);
cout << dp[s][1] << endl;
return 0;
}