#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
vector<string> vs;
char s[N];
int dp[N];
struct node {
  int idx;
  node *ch[26];
  node() {
    idx = -1;
    memset(ch, NULL, sizeof(ch));
  }
} * trie;
void insert(node *root, const char *s, int num) {
  if (s[0] == '\0') {
    root->idx = num;
    return;
  }
  int i = s[0] - 'a';
  if (root->ch[i] == NULL) root->ch[i] = new node();
  insert(root->ch[i], s + 1, num);
}
int query(node *root, const char *s, int x) {
  if (s[0] == '\0') return 1;
  if (dp[x] != -1) return dp[x];
  int len = strlen(s);
  node *tree = root;
  for (int i = 0; i <= len; i++) {
    if (tree->idx != -1)
      if (query(root, s + i, x + i)) return dp[x] = tree->idx;
    int e = s[i] - 'a';
    if (tree->ch[e] == NULL) return dp[x] = 0;
    tree = tree->ch[e];
  }
  return dp[x] = 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  trie = new node();
  int n, m;
  scanf("%d %s %d", &n, s, &m);
  for (int i = 0; i < m; i++) {
    char p[1010], pp[1010];
    scanf("%s", p);
    vs.push_back(p);
    int len = strlen(p);
    for (int j = len - 1; j >= 0; j--) pp[len - j - 1] = tolower(p[j]);
    pp[len] = '\0';
    insert(trie, pp, i + 1);
  }
  memset(dp, -1, sizeof(dp));
  query(trie, s, 0);
  for (int i = 0; i <= n; i++) {
    if (dp[i] > 0) printf("%s ", vs[dp[i] - 1].c_str());
  }
  return 0;
}
