//去掉无用的发票
//乘以100变成整数
//最后DP
//坚持不懈,提交了8回终于AC~~~!!!
#include<stdio.h>
#define N 35
int max(int a,int b){
return a>b?a:b;
}
int a[3000010];
int main()
{
double price,p,sum;
int i,j,n,m,count,flag;
char name;
double pth[N],A,B,C;
while(scanf("%lf%d",&price,&n)!=EOF && n){
count=0;sum=0.0;
for(i=0;i<N;i++)
pth[i]=0.0;
for(i=0;i<3000010;i++)
a[i]=0;
while(n--){
scanf("%d",&m);
flag=1;
A=B=C=0.0;
while(m--){
getchar();
scanf("%c:%lf",&name,&p);
if(name=='A'){
A+=p;
}else if(name=='B')
{
B+=p;
}else if(name=='C'){
C+=p;
}
else{
flag=0;
}
}
if((A+B+C)<=1000 && flag && A<=600 && B<=600 && C<=600){
pth[count]=A+B+C;
count++;
}
else
pth[count]=0.0;
}
//找到有效发票
price=price*100;
for(i=0;i<count;i++){
pth[i]=pth[i]*100;
}//把小数去掉,变成0-1背包问题
for(i=0;i<count;i++){
for(j=(int)price;j>=(int)pth[i];j--){
if(a[j-(int)pth[i]]+(int)pth[i]>a[j])
a[j]=a[j-(int)pth[i]]+(int)pth[i];
}
}
printf("%.2lf\n",a[(int)price]/100.0);
}
return 0;
}