#include<bits/stdc++.h>
#define N 210000
using namespace std;
int n,m,id[N],size[N],total,fa[N],wht[N],rk;
int ls[N*20],rs[N*20],siz[N*20],tot,had[N];
long long sum[N*20],Ans;
int head[N],last[N];
struct node{
int to,next;
} e[N];
struct note {
int id,val,sor;
} a[N];
bool cmpa(note aa,note bb){
return aa.val<bb.val;
}
bool cmpb(note aa,note bb){
return aa.id<bb.id;
}
void add_edge(int u,int v,int id) {
if(head[u] == 0) head[u] = id;
else e[last[u]].next = id;
e[id].to = v,last[u] = id;
}
void dfs(int now) {
++total,id[now]=total,size[now]=1;
int u = 1 , v = n , w = had[total-1];
++tot , had[total] = rk = tot;
while(u<v) {
int mid=(u+v)/2;
if(a[now].sor<=mid) v=mid,rs[tot]=rs[w],ls[tot]=tot+1,siz[tot]=siz[w]+1,sum[tot]=sum[w]+a[now].val,++tot,w=ls[w];
else u=mid+1,ls[tot]=ls[w],rs[tot]=tot+1,siz[tot]=siz[w]+1,sum[tot]=sum[w]+a[now].val,++tot,w=rs[w];
}
siz[tot]=1,sum[tot]=a[now].val;
for(int i = head[now]; i != 0; i= e[i].next)
dfs(e[i].to) , size[now] += size[e[i].to];
}
void build(int x,int y){
tot=max(tot,x);
if(y==1) return;
ls[x]=x*2,rs[x]=x*2+1;
build(x*2,(y+1)/2);
build(x*2+1,y/2);
}
int main() {
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) {
scanf("%d%d%d",&fa[i],&a[i].val,&wht[i]),a[i].id=i;
if(fa[i] != 0) add_edge(fa[i],i,i-1);
}
sort(a+1,a+n+1,cmpa);
for(int i = 1; i <= n; i++) a[i].sor=i;
sort(a+1,a+n+1,cmpb);
build(1,n),had[0]=1;
dfs(1);
for(int i = 1; i <= n; i++) {
int ans = 0;
int K = m , u = 1, v = n , lm = had[id[i]-1] , rm = had[id[i]+size[i]-1];
while(u<v) {
int mid = (u+v)/2;
if(sum[ls[rm]]-sum[ls[lm]]>(long long)(K)) lm=ls[lm],rm=ls[rm],v=mid;
else K-=sum[ls[rm]]-sum[ls[lm]],ans+=siz[ls[rm]]-siz[ls[lm]],lm=rs[lm],rm=rs[rm],u=mid+1;
// cout<<u<<" "<<v<<" "<<ans<<endl;
}
if(K >= sum[rm]) ans += siz[rm];
//cout<<wht[i]<<" "<<ans<<endl;
Ans = max(Ans,(long long)(wht[i])*ans);
}
printf("%lld\n",Ans);
return 0;
}