#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=3e5+10;
ll val[N];
int pa[N],id[N];
vector<int> adj[N];
struct uwu{
ll req,pro;
bool operator<(const uwu &x) const {
return req>x.req;
}
};
priority_queue<uwu> q[N];
void deb(int u){
vector<uwu> v;
while(!q[u].empty()){
//cout<<q[u].top().req <<" " <<q[u].top().pro <<"\n";
v.push_back(q[u].top());
q[u].pop();
}
while(!v.empty()){
q[u].push(v.back());
v.pop_back();
}
}
int merge(int x,int y){
if(q[x].size()>q[y].size()) swap(x,y);
while(!q[x].empty()){
auto bk=q[x].top();
q[x].pop();
q[y].push(bk);
}
return y;
}
void modi(int x,uwu y){
while(!q[x].empty() && (y.pro<=0 || y.req>=q[x].top().req)){
auto t=q[x].top();
q[x].pop();
y.req=max(y.req,t.req-y.pro);
y.pro+=t.pro;
}
if(y.pro>0) q[x].push(y);
}
void dfs(int u){
if(adj[u].size()==0){
//cout<<"lv" <<u <<"\n";
//cout<<0 <<" " <<val[u] <<"\n";
id[u]=u;
if(val[u]>0) q[u].push({0,val[u]});
return;
}
for(int i=0;i<adj[u].size();i++){
int v=adj[u][i];
dfs(v);
if(i==0) id[u]=id[v];
else id[u]=merge(id[u],id[v]);
}
uwu tmp={max(0LL,-val[u]),val[u]};
//cout<<"pr";
//deb(id[u]);
modi(id[u],tmp);
//cout<<"vs" <<u <<"\n";
//deb(id[u]);
}
int main(){
int n; cin>>n >>val[0];
for(int i=1;i<=n;i++){
cin>>val[i] >>pa[i];
adj[pa[i]].push_back(i);
}
dfs(0);
ll ans=0;
while(!q[id[0]].empty()){
auto [ta,tb]=q[id[0]].top();
q[id[0]].pop();
if(ans<ta) break;
ans+=tb;
}
cout<<ans-val[0];
}