#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
const int M=2005;
const int N=105;
const int INF=1e+9;
int time,n=1,f[N][M],m;
struct tree{
int l,r,w,j;
}q[N];
void dfsload(int p,int x){
n++; int now=n;
cin>>q[n].w>>q[n].j;
m+=q[n].j;
if(x==0) q[p].l=n;
else q[p].r=n;
if(q[now].j==0){
dfsload(now,0); dfsload(now,1);
}
}
void checktree(int p){
if(p>n||p==0) return;
cout<<p<<' '<<q[p].l<<' '<<q[p].r<<' '<<q[p].w<<' '<<q[p].j<<endl;
checktree(q[p].l); checktree(q[p].r);
}
void solve(int p){
if(p==0) return;
if((q[p].l==0)&&(q[p].r==0)){
f[p][0]=0;
for(int i=1;i<=q[p].j;i++) f[p][i]=i*5+q[p].w*2;
return;
}
solve(q[p].l); solve(q[p].r);
q[p].j=q[q[p].l].j+q[q[p].r].j;
for(int i=0;i<=q[q[p].l].j;i++)
for(int j=0;j<=q[q[p].r].j;j++){
f[p][i+j]=min(f[p][i+j],(f[q[p].l][i]+f[q[p].r][j]+q[p].w*2));
}
}
int main(){
freopen("gallery.in","r",stdin);
for(int i=0;i<N;i++)
for(int j=0;j<M;j++) f[i][j]=INF;
cin>>time;
dfsload(1,0);
solve(1);
for(int i=m;i>=0;i--){
if(f[1][i]<time){
cout<<i<<endl; break;
}
}
return 0;
}