#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<queue>
#include<deque>
#include<stack>
#include<string>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<bitset>
#include<stdlib.h>
#include<cassert>
#include<time.h>
#include<bitset>
using namespace std;
const long long mod=1000000007;
const long long inf=mod*mod;
const long long d2=(mod+1)/2;
const long double EPS=1e-9;
const long double PI=acos(-1.0);
int ABS(int a){return max(a,-a);}
long long ABS(long long a){return max(a,-a);}
long double ABS(long double a){return max(a,-a);}
long long d[110];
vector<int>g[110];
int sz[110];
long long val[110];
void dfs(int a){
	for(int i=0;i<g[a].size();i++){
		dfs(g[a][i]);
		val[a]+=val[g[a][i]];
		sz[a]+=sz[g[a][i]];
	}
	sz[a]++;
	val[a]+=d[a];
}
pair<long double,int>ev[110];
long long dp[200000];
int main(){
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	for(int i=0;i<a;i++){
		scanf("%lld",d+i);
		if(i){
			int pr;scanf("%d",&pr);pr--;
			g[pr].push_back(i);
		}
	}
	dfs(0);
	reverse(sz,sz+a);
	reverse(val,val+a);
	//for(int i=0;i<a;i++)printf("%d %lld\n",sz[i],val[i]);
	for(int i=0;i<a;i++){
		ev[i]=make_pair((long double)val[i]/sz[i],i);
	}
	std::sort(ev,ev+a);
	long long ret=0;
	for(int i=1;i<200000;i++)dp[i]=inf;
	int dd=0;
	for(int i=0;i<a;i++){
		int U=min(50,c);
		if(sz[i]==a)U=50;
		for(int j=dd;j>=0;j--){
			for(int k=0;k<=U;k++){
				dp[j+k*sz[i]]=min(dp[j+k*sz[i]],dp[j]+val[i]*k);
			}
		}
		dd+=U*sz[i];
	}
	for(int i=0;i<=dd;i++){
		if(dp[i]>b)continue;
		long long tmp=i;
		long long rem=b-dp[i];
		for(int j=0;j<a;j++){
			int at=ev[j].second;
			long long use;
			use=min(rem/val[at],(long long)max(c-50,0));
			if(sz[at]==a){
				use=rem/val[at];
			}
			rem-=val[at]*use;
			tmp+=sz[at]*use;
		}
		ret=max(ret,tmp);
	}
	printf("%lld\n",ret);
}
