#include <bits/stdc++.h>
using namespace std;
const int MAX = 2e6 + 5;
int ends_here[MAX];
int qs, qe;
struct data {
  int child[26];
  int score;
  bool leaf;
  int suf;
  int ends;
};
data arr[MAX];
int que[MAX];
int cur;
struct aho_corasick {
  int root;
  int size;
  void init() { root = (++cur); }
  void insert(string s, int ind) {
    int node = root;
    for (int i = 0; i < s.length(); i++) {
      int c = s[i] - 'a';
      if (!arr[node].child[c]) {
        arr[node].child[c] = (++cur);
      }
      node = arr[node].child[c];
    }
    ++size;
    arr[node].leaf = 1;
    arr[node].ends = ind;
  }
  int find(int node, int c) {
    while (node != root) {
      if (arr[node].child[c]) {
        return arr[node].child[c];
      }
      node = arr[node].suf;
    }
    if (arr[root].child[c]) {
      return arr[root].child[c];
    } else {
      return root;
    }
  }
  void prepare() {
    qs = 0;
    qe = 0;
    que[qe++] = root;
    arr[root].suf = root;
    while (qs < qe) {
      int node = que[qs++];
      for (int i = 0; i < 26; i++) {
        if (arr[node].child[i]) {
          int nxt = arr[node].child[i];
          if (node != root) {
            arr[nxt].suf = find(arr[node].suf, i);
          } else {
            arr[nxt].suf = root;
          }
          arr[nxt].score = arr[arr[nxt].suf].score + arr[nxt].leaf;
          que[qe++] = nxt;
        }
      }
    }
  }
  long long query(string s) {
    int node = root;
    long long ans = 0;
    for (int i = 0; i < s.length(); i++) {
      int c = s[i] - 'a';
      node = find(node, c);
      ans += arr[node].score;
    }
    return ans;
  }
  void dfs(int s1, int s2) {
    arr[s1].leaf |= arr[s2].leaf;
    for (int i = 0; i < 26; i++) {
      if (!arr[s2].child[i]) {
        continue;
      }
      if (!arr[s1].child[i]) {
        arr[s1].child[i] = arr[s2].child[i];
        continue;
      }
      dfs(arr[s1].child[i], arr[s2].child[i]);
    }
  }
  void merge(aho_corasick other) {
    dfs(root, other.root);
    size += other.size;
  }
};
int n, k;
set<int> pos;
vector<int> hlp;
void check(int ind) {
  int f = 0;
  for (int i = ind;; i += k) {
    if (ends_here[i + k - 1] == 0) {
      f = 1;
      break;
    }
    if (pos.find(ends_here[i + k - 1]) != pos.end()) {
      f = 1;
      break;
    }
    pos.insert(ends_here[i + k - 1]);
    hlp.push_back(ends_here[i + k - 1]);
    if (pos.size() == n) {
      break;
    }
  }
  if (f == 0) {
    printf("YES\n");
    for (auto x : hlp) {
      printf("%d ", x);
    }
    exit(0);
  } else {
    pos.clear();
    hlp.clear();
  }
}
string str[100005];
int main() {
  aho_corasick a;
  a.init();
  scanf("%d %d", &n, &k);
  string s;
  cin >> s;
  s = s + s;
  int m;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    cin >> str[i];
    a.insert(str[i], i);
  }
  a.prepare();
  int st = a.root;
  for (int i = 0; i < s.length(); i++) {
    int c = s[i] - 'a';
    st = a.find(st, c);
    if (arr[st].score > 0) {
      ends_here[i] = arr[st].ends;
    }
  }
  for (int i = 0; i < k; i++) {
    check(i);
  }
  printf("NO\n");
  return 0;
}
