#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node
{
int arriving, playing, hour, minute, second;
};
int table[110], usercount[110];
int cmp(node n1, node n2)
{
return n1.arriving < n2.arriving;
}
int main()
{
int n;
scanf("%d", &n);
vector<node> v[2];
int i, tag;
node nod;
for(i = 1; i <= n; i++)
{
scanf("%d:%d:%d %d %d", &nod.hour, &nod.minute, &nod.second, &nod.playing, &tag);
nod.arriving = nod.hour * 3600 + nod.minute * 60 + nod.second;
if(nod.arriving >= 21 * 3600)
{
continue;
}
if(nod.playing > 120)
{
nod.playing = 120;
}
nod.playing *= 60;
v[tag].push_back(nod);
}
int k, m;
scanf("%d%d", &k, &m);
int viptable;
for(i = 1; i <= m; i++)
{
scanf("%d", &viptable);
table[viptable] = 1;
}
int former[110], flag[110];
for(i = 1; i <= k; i++)
{
former[i] = 8 * 3600;
flag[i] = 1;
}
int size[2];
for(i = 0; i <= 1; i++)
{
size[i] = v[i].size();
if(size[i] > 0)
{
sort(v[i].begin(), v[i].end(), cmp);
}
}
int index[2] = {0, 0}, mintime[2], minindex[2], res, tableindex, wait, enter, whileflag;
node cur[2];
while(1)
{
whileflag = 0;
for(i = 0; i <= 1; i++)
{
if(index[i] < size[i])
{
whileflag = 1;
cur[i] = v[i][index[i]];
}
}
if(whileflag == 0)
{
break;
}
for(i = 0; i <= 1; i++)
{
mintime[i] = 10000000;
minindex[i] = -1;
}
for(i = 1; i <= k; i++)
{
if(flag[i] == 1)
{
if(former[i] < mintime[0])
{
mintime[0] = former[i];
minindex[0] = i;
}
if(table[i] == 1 && former[i] < mintime[1])
{
mintime[1] = former[i];
minindex[1] = i;
}
}
}
if(minindex[0] == -1)
{
break;
}
if(index[0] == size[0])
{
res = 1;
}
else if(index[1] == size[1])
{
res = 0;
}
else
{
for(i = 0; i <= 1; i++)
{
cur[i] = v[i][index[i]];
}
if(cur[1].arriving < cur[0].arriving)
{
res = 1;
}
else
{
if(cur[0].arriving >= mintime[0] || cur[1].arriving >= mintime[0])
{
res = 0;
}
else
{
if(mintime[0] == mintime[1])
{
res = 1;
}
else
{
res = 0;
}
}
}
}
nod = cur[res];
tableindex = minindex[0];
if(res == 1 && mintime[1] <= nod.arriving)
{
tableindex = minindex[1];
}
printf("%02d:%02d:%02d ", nod.hour, nod.minute, nod.second);
if(former[tableindex] < nod.arriving)
{
enter = nod.arriving;
wait = 0;
former[tableindex] = nod.arriving + nod.playing;
}
else
{
enter = former[tableindex];
wait = former[tableindex] - nod.arriving;
former[tableindex] += nod.playing;
}
if(wait % 60 >= 30)
{
wait = wait / 60 + 1;
}
else
{
wait /= 60;
}
nod.hour = enter / 3600;
nod.minute = (enter - nod.hour * 3600) / 60;
nod.second = enter % 60;
printf("%02d:%02d:%02d %d\n", nod.hour, nod.minute, nod.second, wait);
usercount[tableindex]++;
index[res]++;
if(former[tableindex] >= 21 * 3600)
{
flag[tableindex] = 0;
}
}
for(i = 1; i <= k; i++)
{
if(i > 1)
{
printf(" ");
}
printf("%d", usercount[i]);
}
printf("\n");
system("pause");
return 0;
}