#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 3e5 + 5;
const int INF = 1e18;
int Value[N];
vector<int> Graph[N];
int Need[N];
int To[N];
int Profit[N];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> PQ;
bool DFS(int u)
{
pair<int, int> mini = {INF, 0};
int sum = Value[u];
for(auto v : Graph[u]) {
if(DFS(v)) {
mini = min(mini, {Need[v], v});
sum += Profit[v];
}
}
if(Value[u] >= 0) {
Need[u] = 0;
To[u] = u;
Profit[u] = sum;
return true;
} else {
if(sum < 0) {
Profit[u] = -1;
return false;
}
Profit[u] = sum;
Need[u] = mini.first + abs(Value[u]);
To[u] = mini.second;
return true;
}
}
int Solve(int s)
{
int starter = s;
while(!PQ.empty()) {
if(s < PQ.top().first)
break;
auto [d, u] = PQ.top();
PQ.pop();
do {
s += Value[u];
for(auto v : Graph[u]) {
if(Profit[v] > 0 && v != To[u])
PQ.push({Need[v], v});
}
if(u == To[u])
break;
u = To[u];
}while(true);
}
return (s - starter);
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, s, x, p;
cin >> n >> s;
for(int i = 0; i < n; i++) {
cin >> x >> p;
Value[i+1] = x;
Graph[p].push_back(i+1);
}
for(auto e : Graph[0]) {
if(DFS(e))
PQ.push({Need[e], e});
}
cout << Solve(s) << "\n";
return 0;
}