#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=55;
struct edge{
	int to,nxt; 
}e[maxn];
int head[maxn],tot;
void add(int x,int y){
	e[++tot].to=y;
	e[tot].nxt=head[x];
	head[x]=tot;
}
int n,X,d;
struct goods{
	ll cost;int val,id;
}a[maxn];
bool operator<(goods a,goods b){return a.val*b.cost>b.val*a.cost; }
ll dp[maxn*maxn*maxn];
void dfs(int x){
    a[x].val=1,a[x].id=x;
    for(int i=head[x];i;i=e[i].nxt){
    	int y=e[i].to;
    	dfs(y);
    	a[x].cost+=a[y].cost;
    	a[x].val+=a[y].val;
    }
}
int main(){
    cin>>n>>X>>d;//n个物品  
    cin>>a[1].cost;
    for(int i=2,x;i<=n;++i)
        cin>>a[i].cost>>x,add(x,i);
    dfs(1); 
	int N=n*n*n,L=min(n,d);//每个物品拿出L个 
    memset(dp,0x3f,sizeof(dp)),dp[0]=0;//dp[i]表示收益为i时最少需要多少代价 
    //先把每个物品拿出来min(n,d)个出来dp 
	for(int i=1;i<=n;++i){
        int x=L;
        for(int j=0;1<<j<=x;++j){//倍增地选第i个物品 
            int val=a[i].val*(1<<j);ll cost=a[i].cost*(1<<j);
            for(int k=N;k>=val;--k)dp[k]=min(dp[k],dp[k-val]+cost);
            x-=1<<j;
        }
        if(x){//还有剩余 
            int val=a[i].val*x; 
			ll cost=a[i].cost*x;
            for(int j=N;j>=val;--j)dp[j]=min(dp[j],dp[j-val]+cost);
        }
    }
    sort(a+1,a+n+1);
    while(a[n].id!=1)--n;//比a[1]性价比还低的可以直接排除 
    ll ans=0;
    for(int i=0;i<=N;++i){
        if(dp[i]>X)continue;
        ll val=i,cost=dp[i];
        for(int j=1;j<n;++j){//性价比从高到低选 每个都尽量选完 
            ll c=min((ll)d-L,(X-cost)/a[j].cost);
            val+=c*a[j].val,cost+=c*a[j].cost;
        }
        ll c=(X-cost)/a[n].cost;//最后如果还有余量 可以选a[1] 
        val+=c*a[n].val,cost+=c*a[n].cost;
        ans=max(ans,val);
    }
    printf("%lld\n",ans);
}
