using namespace std;
struct nd
{
int f;
int l;
int r;
};
vector<int>brr;
vector<int>cp1;
vector<int>cp2;
vector<nd>xrr;
int maxdfs(int x, int ceng)
{
brr[ceng]++;
if (xrr[x].l == NULL && xrr[x].r == NULL)
{
return 0;
}
else if (xrr[x].r == NULL && xrr[x].l != NULL)
{
return maxdfs(xrr[x].l, ceng + 1);
}
else if (xrr[x].r != NULL && xrr[x].l == NULL)
{
return maxdfs(xrr[x].r, ceng + 1);
}
else
{
return max(maxdfs(xrr[x].l, ceng + 1), maxdfs(xrr[x].r, ceng + 1));
}
return 0;
}
int ix = 0;
int find()
{
for (; ix < cp1.size(); ix++)
{
for (int jx = 0; jx < cp2.size(); jx++)
{
if (cp1[ix] == cp2[jx])
{
return 1;
}
}
}
ix--;
return 0;
}
int cmp(int a, int b)
{
return a > b ? a : 0;
}
int n1 = 0, n2 = 0;
void hs(int x, int y)
{
n1 = cp1.size();
n2 = cp2.size();
if (n1 == 0)
{
cp1.push_back(x);
}
else if (x != cp1[n1 - 1])
{
cp1.push_back(x);
}
if (n2 == 0)
{
cp2.push_back(y);
}
else if (y != cp2[n2 - 1])
{
cp2.push_back(y);
}
if (find())
{
return;
}
if (x != 1)
{
if (xrr[x].f != NULL)
{
x = xrr[x].f;
}
}
if (y != 1)
{
if (xrr[y].f!= NULL)
{
y = xrr[y].f;
}
}
hs(x, y);
}
int main()
{
int n;
cin >> n;
int tempf, temps;
xrr.resize(n+1);
brr.resize(9);
xrr[1].f = 0;
for (int i = 1; i < n; i++)
{
cin >> tempf >> temps;
if (xrr[tempf].l == NULL)
{
xrr[tempf].l = temps;
}
else
{
xrr[tempf].r = temps;
}
xrr[temps].f = tempf;
}
maxdfs(xrr[1].l, 2);
maxdfs(xrr[1].r, 2);
for (int i = 8; i >= 0; i--)
{
if (brr[i] != 0)
{
cout << i << endl;
break;
}
}
sort(brr.begin(), brr.end(), cmp);
cout << brr[0] << endl;
int x, y;
cin >> x >> y;
hs(x, y);
int sum = 0;
n1 = cp1.size();
n2 = cp2.size();
for (int i = 0; i < n1-1; i++)
{
sum += 2;
}
for (int i = 0; i < n2; i++)
{
if (cp2[i] == cp1[ix])
{
break;
}
sum += 1;
}
cout << sum << endl;
}```