#include <bits/stdc++.h>
using namespace std;
struct player{
int come,start,serve,train,vip;//来到时间,开始训练时间,服务时间,是否训练,是否为vip
}pla[10010];//0--n-1
struct table{
int vip,endtime,num;//是否为vip,球桌服务结束时间,服务人数
}tab[110];//1--k
int np,nt,nvip;//球员数量,球桌数量,vip球桌数量
int gettime(int h,int m,int s){
return h*3600+m*60+s;
}
bool cmp1(player a,player b){
return a.come<b.come;
}
bool cmp2(player a,player b){
return a.start<b.start;
}
int main(){
cin>>np;
int h,m,s,vipnum,sevre;
for(int i=0;i<np;i++){
scanf("%d:%d:%d %d %d",&h,&m,&s,&pla[i].serve,&pla[i].vip);
pla[i].serve=min(pla[i].serve*60,7200);
pla[i].come=gettime(h,m,s);
pla[i].start=INT_MAX;
}
cin>>nt>>nvip;
int st=gettime(8,0,0),ed=gettime(21,0,0);
for(int i=1;i<=nt;i++)tab[i].endtime=st;//初始化球桌
while(nvip--){
scanf("%d",&vipnum);
tab[vipnum].vip=1;
}
sort(pla,pla+np,cmp1);//按到达时间排序
int numl=0,numr=0;//numl为当前队列中来的最早的没有被服务的编号,numr为队列中endtime后的第一个人
while(numl<np){
while(pla[numl].train)numl++;//找出队列中第一个没有被服务
if(pla[numl].come>=ed)break;//如果第一个没有被服务的人在21点后,则不服务了
//选出合适的table
int minendtime=INT_MAX,cho;
for(int i=1;i<=nt;i++){
if(tab[i].endtime<minendtime){
cho=i;
minendtime=tab[i].endtime;
}
}
for(int i=1;i<=nt;i++){
//vip球员优先选择vip球桌,非vip球员选择编号最小的空闲球桌
if(pla[numl].come>=tab[i].endtime&&(pla[numl].vip&&tab[i].vip||!pla[numl].vip)){
cho=i;
break;
}
}
if(minendtime>=ed)break;//如果已经21点后,则不服务了
//找出队列中endtime后的第一个人
while(pla[numr].come<=tab[cho].endtime&&numr<np)numr++;
if(numl<numr){//endtime前有人在等
if(tab[cho].vip){//是vip球桌
int i;
for(i=numl;i<numr;i++){
if(pla[i].vip&&!pla[i].train)break;
}
if(i==numr)i=numl;//没有找到了没有服务过的vip球员
pla[i].train=1;
pla[i].start=tab[cho].endtime;
tab[cho].endtime+=pla[i].serve;
}else{//非vip球桌
pla[numl].train=1;
pla[numl].start=tab[cho].endtime;
tab[cho].endtime+=pla[numl].serve;
}
tab[cho].num++;
}else if(numl<np){//没有人等,则选择第一个来的即可
pla[numl].train=1;
tab[cho].endtime=pla[numl].come+pla[numl].serve;
pla[numl].start=pla[numl].come;
tab[cho].num++;
}
}
sort(pla,pla+np,cmp2);//按服务开始时间排序
for(int i=0;i<np;i++){
if(!pla[i].train)break;
int co=pla[i].come,sta=pla[i].start;
int ans=(int)round((sta-co)/60.0);
printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",co/3600,co%3600/60,co%60,sta/3600,sta%3600/60,sta%60,ans);
}
for(int i=1;i<=nt;i++){
printf("%d",tab[i].num);
if(i<nt)printf(" ");
}
return 0;
}