// 作者: Jacobzp
// 指导老师: 左程云老师
// 学习视频: bilibili 算法讲解078【必备】树形dp-上
#include <bits/stdc++.h>
#include <limits>
using namespace std;
#define int long long
#define endl '\n'
int n, root;
struct TreeNode {
int val;
int lid, rid;
bool isExist;
} node[1000005];
struct Info {
int max_val, min_val;
bool isBst;
int maxBstSize;
Info(int a, int b, bool c, int d) {
max_val = a, min_val = b, isBst = c, maxBstSize = d;
}
};
Info f(TreeNode x) {
if (!x.isExist) {
return Info(numeric_limits<int>::min(), numeric_limits<int>::max(), true, 0);
}
Info l = f(node[x.lid]), r = f(node[x.rid]);
int max_val = max(x.val, max(l.max_val, r.max_val));
int min_val = min(x.val, min(l.min_val, r.min_val));
bool isBst = l.isBst && r.isBst && l.max_val<x.val && x.val<r.min_val;
int maxBstSize;
if (isBst) {
maxBstSize = l.maxBstSize + r.maxBstSize + 1;
}
else {
maxBstSize = max(l.maxBstSize, r.maxBstSize);
}
return Info(max_val, min_val, isBst, maxBstSize);
}
int32_t main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> root;
for (int i = 1; i <= n; i++) {
int fa, lid, rid;
cin >> fa >> lid >> rid;
node[fa].val = fa, node[lid].val = lid, node[rid].val = rid;
node[fa].lid = lid, node[fa].rid = rid;
node[fa].isExist = true;
if (lid != 0) node[lid].isExist = true;
if (rid != 0) node[rid].isExist = true;
}
cout << (f(node[root])).maxBstSize << endl;
}