#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
int n;
ll arr[300023];
int par[300023];
vector<int>child[300023];
ll need[300023],win[300023];
set<pair<ll,int>>st[300023];
void dfs(int pos){
for(int x:child[pos]){
dfs(x);
if(win[x]>=0){
st[pos].insert({need[x],x});
}
}
need[pos]=-arr[pos];
win[pos]=arr[pos];
while(win[pos]<0&&st[pos].size()){
need[pos]=max(need[pos],-(win[pos]-st[pos].begin()->fr));
int x=st[pos].begin()->sc;
win[pos]+=win[x];
st[pos].erase(st[pos].begin());
if(st[x].size()>st[pos].size()){
swap(st[x],st[pos]);
}
for(auto y:st[x]){
st[pos].insert(y);
}
st[x].clear();
}
}
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n>>arr[0];
for(int i=1;i<=n;i++){
cin>>arr[i]>>par[i];
child[par[i]].pb(i);
}
dfs(0);
ll ans=win[0];
while(st[0].size()){
int x=st[0].begin()->sc;
if(need[x]>ans)break;
ans+=win[x];
st[0].erase(st[0].begin());
if(st[x].size()>st[0].size()){
swap(st[x],st[0]);
}
for(auto y:st[x]){
st[0].insert(y);
}
st[x].clear();
}
cout<<ans-arr[0]<<endl;
}