#include<bits/stdc++.h>
using namespace std;
int n,m,num;
struct Ti{
int manfen;//满分值
int xxnum;//选项个数
int rightxxnum;//正确选项个数
vector<char> rightxx;//所有正确选项
map<char,int> wrong;//错误选项和错误次数
};
struct Stu{
double score = 0.0;//学生得分
};
int main(){
cin>>n>>m;
Ti ti[m];
Stu stu[n];
for(int i=0;i<m;i++){//m个多选题
cin>>ti[i].manfen>>ti[i].xxnum>>ti[i].rightxxnum;
for(int j=0;j<ti[i].rightxxnum;j++){
char xx;
cin>>xx;
ti[i].rightxx.push_back(xx);
}
}
scanf("\n");
for(int i=0;i<n;i++){//n个学生
int tihao = 0;
bool konggeflag = false;
while(tihao<m){//题目数
if(konggeflag)
scanf(" ");
scanf("(%d",&num);//选中的选项个数
//cout<<"num: "<<num<<endl;
konggeflag = true;
int zhengquexx = 0;
bool quanduiflag = false;
vector<char> stuxx;//临时存储一道题某学生选择的所有选项
char xuanxiang;
for(int j=0;j<num;j++){//每道题num个选项
scanf(" %c",&xuanxiang);
stuxx.push_back(xuanxiang);
//cout<<"xuanxiang: "<<xuanxiang<<endl;
bool isrightxx = false;
//判断学生选的这道题的这个选项是否是正确选项
for(int k=0;k<ti[tihao].rightxx.size();k++){
if(xuanxiang==ti[tihao].rightxx[k]){
zhengquexx++;
isrightxx = true;
break;
}
}
if(!isrightxx){ //该选项选错了
ti[tihao].wrong[xuanxiang]++;
//cout<<"第"<<tihao+1<<"题"<<xuanxiang<<"选项选错了"<<endl;
}
}
/*
cout<<"第"<<tihao+1<<"道题学生选择的所有选项"<<endl;
for(int t=0;t<stuxx.size();t++){
cout<<stuxx[t]<<" ";
}
cout<<endl;
*/
//判断一道题的某个正确选项选没选,每道题有多个正确选项,需要多次判断
bool weixuan = true;
for(int k=0;k<ti[tihao].rightxx.size();k++){
for(int t=0;t<stuxx.size();t++){
if(ti[tihao].rightxx[k]==stuxx[t]){//该正确选项选择了
weixuan = false;
break;
}
}
if(weixuan){//该正确选项没有选
ti[tihao].wrong[ti[tihao].rightxx[k]]++;
//cout<<"第"<<tihao+1<<"题"<<ti[tihao].rightxx[k]<<"选项没有选"<<endl;
}
weixuan = true; //一定要再次设为true,判断下一个正确选项
}
if(zhengquexx == num)//选对的选项个数==选择了选项的个数
quanduiflag = true;//这道题选的都对了
if(quanduiflag&&zhengquexx==ti[tihao].rightxxnum)
stu[i].score+=1.0*ti[tihao].manfen;
else if(quanduiflag&&zhengquexx<ti[tihao].rightxxnum)
stu[i].score+=1.0*ti[tihao].manfen/2;
scanf(")");
tihao++;
}
if(i!=n-1)
scanf("\n");
}
for(int i=0;i<n;i++){
printf("%.1f\n",stu[i].score);
}
bool bucunzai = true;
int maxn = 0;
for(int i=0;i<m;i++){//m道题
for(auto it = ti[i].wrong.begin(); it!=ti[i].wrong.end(); it++){
if(it->second!=0){
bucunzai = false;
if(it->second>maxn)
maxn=it->second;
//cout<<it->second<<" "<<i+1<<"-"<<it->first<<endl;
}
}
}
for(int i=0;i<m;i++){//m道题
for(auto it = ti[i].wrong.begin(); it!=ti[i].wrong.end(); it++){
if(it->second!=0){
bucunzai = false;
if(it->second==maxn)
cout<<it->second<<" "<<i+1<<"-"<<it->first<<endl;
}
}
}
if(bucunzai)
cout<<"Too simple"<<endl;
}