#include <bits/stdc++.h>
using namespace std;
const int NODE = 2000005;
const int CHD = 26;
int ch[NODE][CHD], fail[NODE];
int val[NODE], cnt = 0;
void init() {
  memset(ch[0], 0, sizeof(ch[0]));
  memset(val, 0, sizeof(val));
  cnt = 1;
}
void insert(char* s, int key) {
  int now = 0;
  for (int i = 0; s[i]; i++) {
    int c = s[i] - 'a';
    if (!ch[now][c]) {
      memset(ch[cnt], 0, sizeof(ch[cnt]));
      ch[now][c] = cnt++;
    }
    now = ch[now][c];
  }
  val[now] = key;
}
void getfail() {
  queue<int> q;
  for (int i = 0; i < CHD; i++) {
    if (ch[0][i]) {
      fail[ch[0][i]] = 0;
      q.push(ch[0][i]);
    }
  }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = 0; i < CHD; i++) {
      int v = ch[u][i];
      if (v) {
        q.push(v);
        int f = fail[u];
        while (f && !ch[f][i]) f = fail[f];
        fail[v] = ch[f][i];
      }
    }
  }
}
char t[2000005];
int a[2000005], vis[200005];
int main(int argc, const char* argv[]) {
  init();
  cin.sync_with_stdio(false);
  int n, k, g;
  cin >> n >> k;
  string s;
  cin >> s;
  s += s;
  cin >> g;
  for (int i = 1; i <= g; i++) {
    cin >> t;
    insert(t, i);
  }
  getfail();
  int now = 0;
  for (int i = 0; i < s.size(); i++) {
    int c = s[i] - 'a';
    while (now && !ch[now][c]) now = fail[now];
    now = ch[now][c];
    a[i] = val[now];
  }
  for (int i = k - 1; i < 2 * k - 1; i++) {
    bool flag = true;
    for (int j = 0; j < n; j++) {
      if (a[j * k + i] == 0 || vis[a[j * k + i]]) {
        flag = false;
        break;
      }
      vis[a[j * k + i]] = 1;
    }
    if (flag) {
      cout << "YES" << endl;
      for (int j = 0; j < n; j++) {
        cout << a[j * k + i] << " ";
      }
      return 0;
    }
    for (int j = 0; j < n; j++) {
      if (a[j * k + i] != 0) {
        vis[a[j * k + i]] = 0;
      }
    }
  }
  cout << "NO" << endl;
  return 0;
}
