#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int N=55;
int n,x,d,v[N],w[N],m[N],fa[N],dp[N*N*N];
struct node
{
    int v,w,id;
    double k;
    node(int v=0,int w=0):v(v),w(w){k=1.0*v/w;}
    bool operator<(const node&o)const
    {
        return k>o.k;
    }
}a[N];
int main()
{
    scanf("%d%d%d",&n,&x,&d);
    scanf("%d",&m[1]);
    for(int i=2;i<=n;i++)
        scanf("%d%d",&m[i],&fa[i]);
    for(int i=n;i>=1;i--)
    {
        v[i]++;
        w[i]=min(w[i]+m[i],x+1);
        v[fa[i]]+=v[i];
        w[fa[i]]=min(w[fa[i]]+w[i],x+1);
    }
    for(int i=1;i<=n;i++)
        a[i]=node(v[i],w[i]),a[i].id=i;
    sort(a+1,a+1+n);
    int k=min(n,d);
    memset(dp,inf,sizeof(dp));
    dp[0]=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=k;j++)
            for(int k=n*n*n;k>=v[i];k--)
            dp[k]=min(dp[k],dp[k-v[i]]+w[i]);
    int ans=0;
    for(int i=0;i<=n*n*n;i++)
    {
        if(dp[i]>x) continue;
        int y=x-dp[i],res=i;
        for(int j=1;j<=n;j++)
        {
            int tot=min(a[j].id==1?y/a[j].w:d-k,y/a[j].w);
            res+=tot*a[j].v;
            y-=tot*a[j].w;
        }
        ans=max(ans,res);
    }
    printf("%d\n",ans);
}
