#include <bits/stdc++.h>
using namespace std;
const int root = 0;
const int N = 1010, M = 50010, Q = 50000, INF = 1e9;
struct node {
  int to, next, from, c, w;
};
node edge[N * N * 2];
int graph[N], tot;
int sum, ans, S, T, n;
int h, t, q[M];
int len[N], tag[M], ch[M][26], fail[M];
char s[N], a[N];
int dis[N], fr[N], exist[N];
int pos[510][110];
int val[N];
void addedge(int i, int u, int v, int c, int w) {
  edge[i].to = v;
  edge[i].next = graph[u];
  edge[i].from = u;
  edge[i].c = c;
  edge[i].w = w;
  graph[u] = i;
}
void insert(int num) {
  int i, x = root;
  len[num] = strlen(a + 1);
  for (i = 1; i <= len[num]; i++) {
    if (!ch[x][a[i] - 'a']) ch[x][a[i] - 'a'] = ++tot;
    x = ch[x][a[i] - 'a'];
  }
  tag[x] = num;
}
void build() {
  int i, x = root;
  h = t = 0;
  for (i = 0; i <= 25; i++) {
    if (ch[x][i]) {
      q[++t] = ch[x][i];
      fail[ch[x][i]] = x;
    } else
      ch[x][i] = x;
  }
  while (h < t) {
    x = q[++h];
    for (i = 0; i <= 25; i++) {
      if (ch[x][i]) {
        q[++t] = ch[x][i];
        fail[ch[x][i]] = ch[fail[x]][i];
      } else
        ch[x][i] = ch[fail[x]][i];
    }
  }
}
void match() {
  int x = 0;
  int i, tmp;
  for (i = 1; i <= n; i++) {
    x = ch[x][s[i] - 'a'];
    tmp = x;
    while (tmp) {
      if (tag[tmp]) pos[i][tag[tmp]] = 1;
      tmp = fail[tmp];
    }
  }
}
bool spfa() {
  int i, u, v;
  for (i = 1; i <= sum; i++) dis[i] = -INF;
  h = t = 0;
  dis[S] = 0;
  q[++t] = S;
  while (h != t) {
    h = h % Q + 1;
    u = q[h];
    exist[u] = 0;
    for (i = graph[u]; i; i = edge[i].next) {
      v = edge[i].to;
      if (edge[i].c && dis[v] < dis[u] + edge[i].w) {
        dis[v] = dis[u] + edge[i].w;
        fr[v] = i;
        if (!exist[v]) {
          exist[v] = 1;
          t = t % Q + 1;
          q[t] = v;
        }
      }
    }
  }
  if (dis[T] == -INF)
    return false;
  else
    return true;
}
void mcf() {
  int x = INF, i;
  for (i = fr[T]; i; i = fr[edge[i].from]) x = min(x, edge[i].c);
  for (i = fr[T]; i; i = fr[edge[i].from])
    ans += x * edge[i].w, edge[i].c -= x, edge[i ^ 1].c += x;
}
void costflow() {
  while (spfa()) mcf();
  printf("%d", ans);
}
int main() {
  int x, m;
  int i, j;
  scanf("%d", &n);
  scanf("%s", s + 1);
  scanf("%d", &m);
  for (i = 1; i <= m; i++) {
    scanf("%s", a + 1);
    scanf("%d", &val[i]);
    insert(i);
  }
  scanf("%d", &x);
  build();
  match();
  tot = 1;
  sum = n;
  T = ++sum;
  S = ++sum;
  tot++;
  addedge(tot, S, 1, x, 0);
  tot++;
  addedge(tot, 1, S, 0, 0);
  tot++;
  addedge(tot, n, T, x, 0);
  tot++;
  addedge(tot, T, n, 0, 0);
  for (i = 1; i <= n - 1; i++) {
    tot++;
    addedge(tot, i, i + 1, x, 0);
    tot++;
    addedge(tot, i + 1, i, 0, 0);
  }
  for (i = 1; i <= n; i++) {
    for (j = 1; j <= m; j++) {
      if (pos[i][j]) {
        tot++;
        addedge(tot, i - len[j] + 1, i + 1, 1, val[j]);
        tot++;
        addedge(tot, i + 1, i + 1 - len[j], 0, -val[j]);
      }
    }
  }
  costflow();
}
