#include<bits/stdc++.h>
using namespace std;
const int MAXN=3e5+5;
const long long INF=4e18;
struct node
{
long long d,sum,pos;
};
struct comp
{
bool operator()(node a,node b)
{
if(a.d==b.d) return a.sum<b.sum;
return a.d>b.d;
}
};
int dsu[MAXN],cnt[MAXN],dsu2[MAXN],cnt2[MAXN];
long long A[MAXN],dis[MAXN],dp[MAXN],ans;
vector<int> ds[MAXN],vi[MAXN];
bool ck[MAXN];
priority_queue< node,vector<node>,comp > pq[MAXN];
int root(int i)
{
if(!dsu[i]) return i;
return dsu[i]=root(dsu[i]);
}
void merge(int i,int j)
{
if((i=root(i))==(j=root(j))) return ;
if(cnt[i]<cnt[j]) swap(i,j);
while(!pq[j].empty()) pq[i].push(pq[j].top()),pq[j].pop();
dsu[j]=i,cnt[i]+=cnt[j];
}
int root2(int i)
{
if(!dsu2[i]) return i;
return dsu2[i]=root2(dsu2[i]);
}
void merge2(int i,int j)
{
if((i=root2(i))==(j=root2(j))) return ;
if(cnt2[i]<cnt2[j]) swap(i,j);
for(auto v:vi[j]) vi[i].push_back(v);
dsu2[j]=i,cnt2[i]+=cnt2[j],vi[j].clear();
}
void dfs(int i,long long d)
{
cnt[i]=0,cnt2[i]=1,vi[i].push_back(i);
for(auto v:ds[i])
{
dfs(v,d+A[v]);
merge(i,v);
}
int res=root(i);
long long s=A[i],mx=max(0LL,-A[i]);
while(!pq[res].empty()&&(mx>=pq[res].top().d-min(0LL,s)||s<=0))
{
merge2(i,pq[res].top().pos);
mx=max(mx,pq[res].top().d-min(0LL,s)),s+=pq[res].top().sum,pq[res].pop(),cnt[res]--;
}
if(s>0) dp[i]=mx,cnt[res]++,pq[res].push({mx,s,i});
else dp[i]=INF;
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
long long n,s;
cin>>n>>s;
for(int i=1;i<=n;i++)
{
int res;
cin>>A[i]>>res;
ds[res].push_back(i);
}
dfs(0,0);
priority_queue< pair<long long,int>,vector< pair<long long,int> >,greater< pair<long long,int> > > pq;
pq.push({dp[0],0}),ans=s;
while(!pq.empty())
{
long long a=pq.top().first;
int pos=pq.top().second;
pq.pop();
if(ck[pos]) continue;
if(a>ans) break;
for(auto v:vi[root2(pos)])
{
ck[v]=true,ans+=A[v];
for(auto u:ds[v]) pq.push({dp[u],u});
}
}
cout<<ans-s;
}