#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
#include <stdlib.h>
using namespace std;
typedef struct cus {
int proTime;
int serTime;
int finTime;
} Cus;
int n, m, k, q;
int timee;
queue<int> windows[21];
queue<int> outQueue;
Cus customers[1001];
int query[1001];
void serveCus();
bool winEmpty();
bool winFull();
void printWindows();
char *getTimeString(int t);
int main(int argc, char *argv[]) {
int i, j;
timee = 0;
scanf("%d %d %d %d", &n, &m, &k, &q);
for (i = 0; i < k; i++) {
scanf("%d", &customers[i].proTime);
customers[i].serTime = -1;
customers[i].finTime = -1;
}
for (i = 0; i < q; i++) {
int tmp;
scanf("%d", &tmp);
query[i] = tmp - 1;
}
for (i = 0; i < k; i++) {
if (!winFull()) {
windows[i % n].push(i);
} else {
outQueue.push(i);
}
}
while (!winEmpty()) {
serveCus();
}
for (i = 0; i < q; i++) {
if (customers[query[i]].serTime >= (17 - 8) * 60) {
printf("Sorry\n");
} else {
printf("%s\n", getTimeString(customers[query[i]].finTime));
}
}
}
void serveCus() {
int i;
int minPro = 999999;
for (i = 0; i < n; i++) {
if (!windows[i].empty()) {
if (customers[windows[i].front()].serTime == -1)
customers[windows[i].front()].serTime = timee;
if (customers[windows[i].front()].proTime < minPro) {
minPro = customers[windows[i].front()].proTime;
}
}
}
timee = timee + minPro;
for (i = 0; i < n; i++) {
if (!windows[i].empty()) {
customers[windows[i].front()].proTime -= minPro;
if (customers[windows[i].front()].proTime == 0) {
customers[windows[i].front()].finTime = timee;
windows[i].pop();
if (!outQueue.empty()) {
windows[i].push(outQueue.front());
outQueue.pop();
}
}
}
}
}
bool winEmpty() {
int i = 0;
for (i = 0; i < n; i++) {
if (!windows[i].empty())
return false;
}
return true;
}
bool winFull() {
int i = 0;
for (i = 0; i < n; i++) {
if (windows[i].size() < m)
return false;
}
return true;
}
char *getTimeString(int t) {
char *rt = (char *)malloc(10 * sizeof(int));
sprintf(rt, "%02d:%02d", 8 + t / 60, t % 60);
return rt;
}