#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
//朋友圈 人名映射到朋友圈
typedef struct LNode{
int name;
int arrive;
int deal;
}LNode;
int circle[20000]={0};
int Hash(char *str){
return (str[0]-65)*26*26+(str[1]-65)*26+(str[2]-65);
}
void print_name(int s){
printf("%c%c%c\n",s/26/26+65,s/26%26+65,s%26+65);
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
LNode *p=(LNode*)malloc(sizeof(LNode)*n);
int head=0,tail=0;
int *book=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++) book[i]=0;
for(int i=1;i<=m;i++){
int num;scanf("%d",&num);
while(num--){
char s[4];
scanf("%s",s);
circle[Hash(s)]=i+1;//归属哪一个圈子
}
}
for(int i=0;i<n;i++){
char s[4];
scanf("%s %d %d",s,&p[i].arrive,&p[i].deal);
if(p[i].deal>60) p[i].deal=60;
p[i].name=Hash(s);
}
int coun=0;
book[0]=1;
print_name(p[0].name);
int left,sum=0;
left=p[0].arrive+p[0].deal;
coun++;
LNode front=p[0];
while(coun<=n){
//寻找下一个需要办理的人
//printf("%d\n",sum);
int flag=0;
for(int i=0;i<n;i++){
if(book[i]) continue;
if(p[i].arrive>left) break;
if(circle[front.name]==circle[p[i].name]
&&p[i].arrive<=left){
//printf("I find a friend and I can help him!\n");
flag=1;
book[i]=1;
print_name(p[i].name);
sum+=left-p[i].arrive;
left+=p[i].deal;
front=p[i];
break;
}
}
if(!flag){//按顺序进行查找,不插队
for(int i=0;i<n;i++){
if(book[i]) continue;
//printf("I can not a friend,so I must find next one\n");
print_name(p[i].name);
book[i]=1;
if(left<=p[i].arrive) sum+=0;
else sum+=left-p[i].arrive;
if(p[i].arrive>=left) left=p[i].arrive;
left+=p[i].deal;
front=p[i];
break;
}
}
coun++;
}
printf("%.1lf\n",(sum*1.0)/n);
}