#include <iostream>
#include <limits>
using namespace std;
struct TreeNode {
int val;
TreeNode* left, *right;
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
};
struct ReturnType { //新结构体
int maxDistance;
int height;
ReturnType(int _maxDistance, int _height) : maxDistance(_maxDistance),
height(_height) {}
};
void createTree(TreeNode* root) { //建树
int rootVal, leftVal, rightVal;
cin >> rootVal >> leftVal >> rightVal;
if (leftVal != 0) {
root->left = new TreeNode(leftVal);
createTree(root->left);
}
if (rightVal != 0) {
root->right = new TreeNode(rightVal);
createTree(root->right);
}
}
ReturnType* process(TreeNode* root) {
if (root == nullptr) return new ReturnType(0, 0);
ReturnType* leftData = process(root->left);
ReturnType* rightData = process(root->right);
//更新最大高度以及最大距离信息
int _height = max(leftData->height, rightData->height) + 1;
int _maxDistance = max(leftData->height + rightData->height + 1,
max(leftData->maxDistance, rightData->maxDistance));
return new ReturnType(_maxDistance, _height);
}
int dfs(TreeNode* root, int& result) {
if (!root) {
return 0;
}
int left = dfs(root->left, result);
int right = dfs(root->right, result);
result = max(result, left + right + 1);
return max(left, right) + 1;
}
int main() {
int n, rootVal;
cin >> n >> rootVal;
TreeNode* root = new TreeNode(rootVal);
createTree(root);
int result = 0;
dfs(root, result);
cout << result << endl;
//cout << process(root)->maxDistance << endl;
return 0;
}