#include <bits/stdc++.h>
using namespace std;
struct FastReader {
  FastReader operator>>(int &x) const {
    scanf("%d", &x);
    return *this;
  }
  FastReader operator>>(signed long long &x) const {
    scanf("%I64d", &x);
    return *this;
  }
  FastReader operator>>(double &x) const {
    scanf("%lf", &x);
    return *this;
  }
  FastReader operator>>(char &x) const {
    do {
      x = getchar();
    } while (x == ' ' || x == '\n');
    return *this;
  }
  FastReader operator>>(char *x) const {
    scanf("%s", x);
    return *this;
  }
} in;
struct FastWriter {
  FastWriter operator<<(const int x) const {
    printf("%d", x);
    return *this;
  }
  FastWriter operator<<(const signed long long x) const {
    printf("%I64d", x);
    return *this;
  }
  FastWriter operator<<(const double x) const {
    printf("%lf", x);
    return *this;
  }
  FastWriter operator<<(const char x) const {
    putchar(x);
    return *this;
  }
  FastWriter operator<<(const char *x) const {
    printf("%s", x);
    return *this;
  }
  FastWriter operator<<(const string x) const { return operator<<(x.c_str()); }
} out;
const int N = 10011, B = 1011, K = 26;
struct Node {
  int leaf;
  Node *parent, *child[K];
  Node(Node *parent = NULL) : parent(parent), leaf(-1) {
    for (int i = 0; i < K; i++) child[i] = NULL;
  }
};
void trie_insert(Node *root, char *key, int word) {
  Node *it;
  for (it = root; *key != 0; key++) {
    char c = *key;
    if (c >= 'A' && c <= 'Z') c ^= ' ';
    c -= 'a';
    if (it->child[c] == NULL) it->child[c] = new Node(it);
    it = it->child[c];
  }
  it->leaf = word;
}
int n, m;
char s[N], buf[N];
vector<string> w;
Node *trie;
int sp[N];
vector<int> ans;
int main() {
  trie = new Node();
  in >> n >> s >> m;
  for (int i = 0; i < m; i++) {
    in >> buf;
    w.push_back(string(buf));
    trie_insert(trie, buf, i);
  }
  for (int i = 0; i < n; i++) sp[i] = -1;
  for (int i = 0; i < n; i++) {
    int j = i;
    Node *it = trie;
    while (j >= 0 && it != NULL) {
      char c = s[j] - 'a';
      it = it->child[c], j--;
      if (it == NULL) break;
      if (it->leaf != -1 && (j < 0 || sp[j] != -1)) {
        sp[i] = it->leaf;
        break;
      }
    }
  }
  int it = n - 1;
  while (it >= 0) {
    ans.push_back(sp[it]);
    it -= w[sp[it]].size();
  }
  for (int i = (int)ans.size() - 1; i >= 0; i--) {
    out << w[ans[i]] << ' ';
  }
  return 0;
}
