#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <climits>
#include <cmath>
using namespace std;
int N, K, M;
int endTime[101];
int isvipTable[101];
int playerComplete[10000];
int cnt[101];
struct Player {
int arriveTime;
int playTime;
int isvip;
};
vector<Player> players;
int getseconds(int hh, int mm, int ss) {
return hh * 3600 + mm * 60 + ss;
}
string getstr(int n) {
int ss = n % 60;
n /= 60;
int mm = n % 60;
n /= 60;
int hh = n;
char s[10];
sprintf(s, "%02d:%02d:%02d", hh, mm, ss);
return s;
}
void assign(int p, int table,int serve) {
playerComplete[p] = 1;
endTime[table] = serve+players[p].playTime;
int wait = serve - players[p].arriveTime;
wait = round(1.0 * wait / 60);
cout << getstr(players[p].arriveTime) << " " << getstr(serve) << " " << wait << endl;
cnt[table]++;
//cout << getstr(players[p].arriveTime) << " " << table << " " << getstr(endTime[table]) << endl;
}
int main() {
scanf("%d", &N);
players=vector<Player>(N);
for (int i = 0; i < N; i++) {
int hh, mm, ss, t, v;
scanf("%d:%d:%d %d %d", &hh, &mm, &ss, &t, &v);
Player p;
p.arriveTime = getseconds(hh, mm, ss);
p.playTime = min(2*3600,t * 60);
p.isvip = v;
players[i] = p;
}
scanf("%d%d", &K, &M);
for (int i = 1; i <= K; i++) endTime[i] = 8 * 3600;
for (int i = 0; i < M; i++) {
int a;
scanf("%d", &a);
isvipTable[a] = 1;
}
sort(players.begin(), players.end(), [](Player& p1, Player& p2) {
return p1.arriveTime < p2.arriveTime;
});
//cout << players[0].playTime << endl;
for (int i = 0; i < N; i++) {
//cout << i << endl;
if (playerComplete[i]) continue;
if (players[i].arriveTime >= 21 * 3600) break;
bool hasvacant = false;
int minVacanttable = -1;
int minVacantviptable = -1;
for (int j = 1; j <= K; j++) {
if (endTime[j] <= players[i].arriveTime) {
if (minVacanttable == -1) minVacanttable = j;
if (isvipTable[j]) {
if (minVacantviptable == -1) minVacantviptable = j;
}
hasvacant = true;
}
}
//cout << i << " " << getstr(players[i].arriveTime) << endl;
if (hasvacant) {
if (players[i].isvip) {
if (minVacantviptable != -1) {
assign(i, minVacantviptable, players[i].arriveTime);
} else {
assign(i, minVacanttable, players[i].arriveTime);
}
} else {
assign(i, minVacanttable, players[i].arriveTime);
}
} else { // no vacant table
int minEndTime = INT_MAX;
vector<int> candi;
for (int j = 1; j <= K; j++) {
if (endTime[j] < minEndTime) {
minEndTime = endTime[j];
candi.clear();
candi.push_back(j);
} else if (endTime[j] == minEndTime) {
candi.push_back(j);
}
}
if (minEndTime >= 21 * 3600) break;
bool hasVipTable = false;
int vipTable = -1;
for (int j : candi) {
if (isvipTable[j]) {
hasVipTable = true;
vipTable = j;
break;
}
}
bool hasVipPlayer = false;
int insertVip = -1;
for (int j = i + 1; j < N; j++) {
if (players[j].arriveTime > minEndTime) break;
if (playerComplete[j]) continue;
if (players[j].isvip) {
hasVipPlayer = true;
insertVip = j;
break;
}
}
if (players[i].isvip) {
if (vipTable != -1) {
assign(i, vipTable, minEndTime);
} else {
assign(i, candi[0], minEndTime);
}
} else {
if (vipTable != -1) {
if (insertVip != -1) {
assign(insertVip, vipTable, minEndTime);
i--;
} else {
assign(i, candi[0], minEndTime);
}
} else {
assign(i, candi[0], minEndTime);
}
}
}
}
for (int i = 1; i <= K; i++) {
if (i > 1) printf(" ");
printf("%d", cnt[i]);
}
return 0;
}