/*求除根结点之外子树中最大的结点数
采用并查集的方式,左边归结右边
求最大的子树的结点数
*/
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int f[100002];//初始化f[i]=i,自己对应自己(自己就是自己的"BOSS")
//int flg[100002];
int cnt[100002];//每个BOOS的手下数(也就是我们要求的最大子树的结点数)
int a, b, n;
int getf(int m) {//寻找"BOSS"
if (f[m] == m) return m;//如果BOSS就是自己,直接返回
else {//如果BOSS不是自己,用递归找最终的BOSS
f[m] = getf(f[m]);
return f[m];
}
}
void merge(int a, int b) {
int t1, t2;
t1 = getf(a);//a对应的BOSS
t2 = getf(b);//b对应的BOSS
if (t1 != t2) {//如果a的BOSS不等于b的BOSS
f[t1] = t2;//将a的BOSS归结到b的BOSS下面
//也就是将a的BOSS编程b的手下
cnt[t2] += cnt[t1];//将b的BOSS手下数加一
//f[a] = t2;
/*全部右归并
for (int i = 1; i <= 100000; i++) {
if (f[i] == t1) {
f[i] = t2;
}
}*/
}
//return;
}
int main() {
//int n;
cin >> n;
for (int i = 1; i <= n; i++) {
f[i] = i;
cnt[i] = 1;
}
for (int i = 1; i < n; i++) {
cin >> a >> b;
if (a != 1 && b != 1) {
merge(a, b);
}
}
/*for (int i = 1; i <= n; i++) {
flg[f[i]]++;
}
sort(flg, flg + n);*/
sort(cnt, cnt + n);//数组从下到大排序
cout << cnt[n - 1] << endl;
return 0;
}