#include <bits/stdc++.h>
using namespace std;
#define int long long
const long long inf = 2e18;
void dfs(int st, vector<int>g[], long long x[], multiset<array<long long,2>>costs[]){
for(int i : g[st]){
dfs(i,g,x,costs);
}
for(int i : g[st]){
if(costs[i].size()>costs[st].size()){
swap(costs[i],costs[st]);
}
for(array <long long,2>a:costs[i]){
costs[st].insert(a);
}
}
array<long long,2>ne = {x[st],x[st]};
while(costs[st].size()&&ne<=(*--costs[st].end())){
///merge ne and costs[st].end()
array<long long,2>cur = (*--costs[st].end());
costs[st].erase(--costs[st].end());
ne[0]=min(ne[0],cur[0]+ne[1]);
ne[1]+=cur[1];
}
while(costs[st].size()&&ne[1]<0){
///merge ne and costs[st].end()
array<long long,2>cur = (*--costs[st].end());
costs[st].erase(--costs[st].end());
ne[0]=min(ne[0],cur[0]+ne[1]);
ne[1]+=cur[1];
}
if(ne[1]<=0){
costs[st].clear();
}
else{
costs[st].insert(ne);
}
/*
///time to make my own costs.
deque<array<long long,2>>curr;
int curi = 1;
curr.push_back({x[st],x[st]});
if(g[st].size()){
vector<int>inds(g[st].size(),0);
while(curi<sz+1){
array<long long,2> mx = {-inf,0};
int lasi = -1;
for(int i = 0;i<g[st].size();i++){
if(inds[i]==costs[g[st][i]].size()){
continue;
}
if(costs[g[st][i]][inds[i]]>mx){
lasi=i;
mx=costs[g[st][i]][inds[i]];
}
}
curr.push_back(mx);
inds[lasi]++;
curi++;
}
}
while(curr[0][1]<0){
///merge curr[0],curr[1].
array<long long,2>ne = curr[0];
curr.pop_front();
if(curr.size()){
ne[0]=min(ne[0],curr[0][0]+ne[1]);
ne[1]+=curr[0][1];
curr[0]=ne;
}
else{
break;
}
}
costs[st]=curr;
*/
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n;
long long s;
cin >> n >> s;
n++;
vector<int>g[n];
long long x[n];
for(int i = 1;i<n;i++){
cin >> x[i];
int p;
cin >> p;
g[p].push_back(i);
}
x[0]=s;
///graph is connected, 0 is overall root, start with sum 0.
multiset<array<long long,2>>costs[n];
dfs(0,g,x,costs);
long long ans = 0;
auto it = costs[0].end();
while(it!=costs[0].begin()){
it--;
array<long long,2>a = *it;
if(ans>=-a[0]){
ans+=a[1];
}
else{
break;
}
}
cout << ans-s;
return 0;
}