int max(int a,int b){return a>b?a:b;}
int dp[110][110];
int main(){
int n,t;
while(scanf("%d%d",&n,&t) != -1){
int i,j,k;
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
int m,s;
scanf("%d%d",&m,&s);
if(s == 0){//至少一个
for(j=0;j<=t;j++){
dp[i][j] = MIN;//保证至少取一个
}
while(m--){
int w,v;
scanf("%d%d",&w,&v);
for(j=t;j>=w;j--){
dp[i][j] = max(dp[i][j],dp[i][j-w]+v);//取至少一个
dp[i][j] = max(dp[i][j],dp[i-1][j-w]+v);//这个要取
}
}
}
if(s == 1){//至多一个
for(j=0;j<=t;j++){
dp[i][j] = dp[i-1][j];
}
while(m--){
int w,v;
scanf("%d%d",&w,&v);
for(j=t;j>=w;j--){
dp[i][j] = max(dp[i][j],dp[i-1][j-w]+v);
}
}
}
if(s == 2){//任意
for(j=0;j<=t;j++){
dp[i][j] = dp[i-1][j];
}
while(m--){
int w,v;
scanf("%d%d",&w,&v);
for(j=t;j>=w;j--){
dp[i][j] = max(dp[i][j],dp[i][j-w]+v);
}
}
}
}
int ans = -1;
ans = max(ans,dp[n][t]);
printf("%d\n",ans);
}
return 0;
}