#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=55;
const int maxm=2020;
const int inf=1e9;
int dp[maxn][105][maxm],f[maxn][maxm];
int n,m,cnt,mx[maxn],cost[maxn],ans,v[maxn];
int degree[maxn],head[maxn];
struct edge{
int to,nxt,val;
}e[maxn*maxn];
inline void addedge(int x,int y,int w){
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
e[cnt].val=w;
degree[y]++;
}
char ch[2];
void dfs(int x){
if(!head[x]){
mx[x]=min(mx[x],m/cost[x]);
for(int i=0;i<=mx[x];i++)
for(int j=i;j<=mx[x];j++)
dp[x][i][j*cost[x]]=(j-i)*v[x];
return ;
}
mx[x]=inf;
for(int i=head[x];i;i=e[i].nxt){
dfs(e[i].to);
mx[x]=min(mx[x],mx[e[i].to]/e[i].val);
cost[x]+=e[i].val*cost[e[i].to];
}
mx[x]=min(mx[x],m/cost[x]);
memset(f,-0x3f3f3f3f,sizeof(f));
f[0][0]=0;
for(int c=mx[x];c>=0;c--){
int tot=0;
for(int i=head[x];i;i=e[i].nxt){
tot++;
for(int j=0;j<=m;j++)
for(int k=0;k<=j;k++)
f[tot][j]=max(f[tot][j],f[tot-1][j-k]+dp[e[i].to][c*e[i].val][k]);
}
for(int i=0;i<=c;i++)
for(int j=0;j<=m;j++)
dp[x][i][j]=max(dp[x][i][j],v[x]*(c-i)+f[tot][j]);
}
}
int main(){
memset(dp,-0x3f3f3f3f,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d%s",&v[i],ch);
if(ch[0]==‘A‘){
int tot;
scanf("%d",&tot);
while(tot--){
int to,val;
scanf("%d%d",&to,&val);
addedge(i,to,val);
}
}
else scanf("%d%d",&cost[i],&mx[i]);
}
bool flag=false;
for(int i=1;i<=n;i++) if(degree[i]) flag=true;
if(flag){
for(int i=1;i<=n;i++)
if(!degree[i]){
dfs(i);
for(int j=0;j<=mx[i];j++)
for(int k=0;k<=m;k++)
ans=max(ans,dp[i][j][k]);
}
}
else{
f[0][0]=0;
for(int i=1;i<=n;i++)
for(int k=0;k<=mx[i];k++)
for(int j=m;j>=k*cost[i];j--)
f[i][j]=max(f[i][j],f[i-1][j-k*cost[i]]+k*v[i]);
for(int i=0;i<=m;i++)
ans=max(ans,f[n][i]);
}
printf("%d\n",ans);
return 0;
}