#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 5;
int Values[N];
vector<int> Graph[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Helper[N];
int Index[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> PQ;
void DFS(int u)
{
Index[u] = u;
for(auto v : Graph[u]) {
DFS(v);
if(Helper[Index[v]].size() > Helper[Index[u]].size())
swap(Index[v], Index[u]);
while(!Helper[Index[v]].empty()) {
Helper[Index[u]].push(Helper[Index[v]].top());
Helper[Index[v]].pop();
}
}
pair<int, int> Block = make_pair(max(0ll, -Values[u]), Values[u]);
while(true) {
if(Helper[Index[u]].empty())
break;
if(Block.second <= 0) {
Block.first = max(Block.first, Helper[Index[u]].top().first + (-Block.second));
Block.second += Helper[Index[u]].top().second;
Helper[Index[u]].pop();
} else {
if(Block.first <= Helper[Index[u]].top().first)
break;
Block.first = max(Block.first, Helper[Index[u]].top().first + (-Block.second));
Block.second += Helper[Index[u]].top().second;
Helper[Index[u]].pop();
}
}
if(Block.second > 0)
Helper[Index[u]].push(Block);
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, s, x, p;
cin >> n >> s;
for(int i = 1; i <= n; i++) {
cin >> x >> p;
Values[i] = x;
Graph[p].push_back(i);
}
for(auto e : Graph[0]) {
DFS(e);
while(!Helper[Index[e]].empty()) {
PQ.push(Helper[Index[e]].top());
Helper[Index[e]].pop();
}
}
int starter = s;
while(!PQ.empty()) {
if(s < PQ.top().first)
break;
s += PQ.top().second;
PQ.pop();
}
cout << (s - starter) << "\n";
}