#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//思路:这题学到的知识太多了
// 1.超大数组放在main函数外部定义,不然自动退出
//2.c语言提供strcspn函数可以返回你在字符串中想找到的字符的位置,可以用于去掉fgets输入的换行
//3.解题注意测试输入暗含的换行字符会被gets,用strcmp要注意
//4. 对字符串进行赋值,都会自动在后面加入'\0','\0'后的字符不会对程序造成影响,所以不用担心上一次的旧值会残留
typedef struct snode {
  char zhou[21];
  char usage[81];
} snode;
snode s[100000] = {0};
int main() {
  //  printf("test\n");
  char tmp[105] = {'\0'};

  int i = 0;
  while (1) {
    fgets(tmp, 105, stdin);
    if (strcmp(tmp, "@END@\n") == 0) {
      break;
    }
    int j;
    for (j = 0; j < 20; j++) {
      if (tmp[j] == ']') {
        break;
      }
    }
    strcpy(s[i].usage, &tmp[j + 2]); //赋值用处
    for (int k = 0; k <= j; k++) { //赋值咒语
      s[i].zhou[k] = tmp[k];
    }
    i++;
  }
  int n;
  scanf("%d\n", &n);
  for (int k = 0; k < n; k++) {
    fgets(tmp, 105, stdin);

    if (tmp[0] == '[') { //说明是咒语匹配
      tmp[strcspn(tmp, "\n")] = '\0';//去掉换行
      for (int m = 0; m < i; m++) {
        if (strcmp(tmp, s[m].zhou) == 0) {
          printf("%s", s[m].usage);
          break;
        }
        if (m == (i - 1)) {
          printf("what?\n");
        }
      }
    } else { //说明是功能匹配
      for (int m = 0; m < i; m++) {
        if (strcmp(tmp, s[m].usage) == 0) {
          s[m].zhou[strcspn(s[m].zhou, "]")] = 0;
          printf("%s\n", &s[m].zhou[1]);
          break;
        }
        if (m == (i - 1)) {
          printf("what?\n");
        }
      }

    }
  }


}