#include <bits/stdc++.h>
using namespace std;
string s, t;
const int inf = 1000000000;
int n, m, cnt = 1, ans, T;
int last[6005], q[6005], d[6005], mark[6005];
struct edge {
  int to, next, v, c;
} e[100005];
void insert(int u, int v, int w, int c) {
  e[++cnt].to = v;
  e[cnt].next = last[u];
  last[u] = cnt;
  e[cnt].v = w;
  e[cnt].c = c;
  e[++cnt].to = u;
  e[cnt].next = last[v];
  last[v] = cnt;
  e[cnt].v = 0;
  e[cnt].c = -c;
}
bool spfa() {
  memset(mark, 0, sizeof(mark));
  for (int i = 0; i <= T; i++) d[i] = -1;
  int head = 0, tail = 1;
  q[0] = T;
  mark[T] = 1;
  d[T] = 0;
  while (head != tail) {
    int now = q[head];
    head++;
    if (head == 605) head = 0;
    for (int i = last[now]; i; i = e[i].next)
      if (e[i ^ 1].v && d[now] + e[i ^ 1].c > d[e[i].to]) {
        d[e[i].to] = d[now] + e[i ^ 1].c;
        if (!mark[e[i].to]) {
          mark[e[i].to] = 1;
          q[tail++] = e[i].to;
          if (tail == 605) tail = 0;
        }
      }
    mark[now] = 0;
  }
  return d[0] != -1;
}
int dfs(int x, int f) {
  mark[x] = 1;
  if (x == T) return f;
  int w, used = 0;
  for (int i = last[x]; i; i = e[i].next)
    if (d[e[i].to] == d[x] - e[i].c && e[i].v && !mark[e[i].to]) {
      w = f - used;
      w = dfs(e[i].to, min(w, e[i].v));
      ans += w * e[i].c;
      e[i].v -= w;
      e[i ^ 1].v += w;
      used += w;
      if (used == f) return f;
    }
  return used;
}
void zkw() {
  while (spfa()) {
    mark[T] = 1;
    while (mark[T]) {
      memset(mark, 0, sizeof(mark));
      dfs(0, inf);
    }
  }
}
int x;
int main() {
  cin >> n;
  T = 2 * n + 1;
  getchar();
  cin >> s;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    cin >> t >> x;
    int ll = t.size(), k;
    for (int j = 0; j < n; j++) {
      for (k = 0; k < ll && j + k < n; k++)
        if (s[j + k] != t[k]) break;
      if (k == ll) {
        insert(2 * (j + 1) - 1, 2 * (k + j), 1, x);
      }
    }
  }
  cin >> x;
  for (int i = 0; i <= 2 * n; i++) insert(i, i + 1, x, 0);
  zkw();
  printf("%d\n", ans);
  return 0;
}
