#include <bits/stdc++.h>
using namespace std;
const int N = 509, INF = 1 << 30;
deque<int> q;
int n, m, head[N], tot, cnt = 1, id[N], S, T, _q[N], sum, len[N], Mincost,
                        vis[N], cur[N], dis[N];
char s[N], _s[N][N];
struct Edge {
  int nxt, to, w, c;
} g[N * N * 20];
void add(int from, int to, int w, int c) {
  g[++cnt].nxt = head[from];
  g[cnt].to = to;
  g[cnt].w = w;
  g[cnt].c = c;
  head[from] = cnt;
}
void ADD(int from, int to, int w, int c) {
  add(from, to, w, c), add(to, from, 0, -c);
}
void init() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  T = ++tot;
  for (int i = 1; i <= n + 1; i++) id[i] = ++tot;
  scanf("%d", &m);
  for (int i = 1; i <= m; i++)
    scanf("%s %d", _s[i] + 1, &_q[i]), len[i] = strlen(_s[i] + 1);
  int x;
  scanf("%d", &x);
  for (int i = 1; i <= n; i++) ADD(id[i], id[i + 1], x, 0);
}
void clear() {
  memcpy(cur, head, sizeof(cur));
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i <= tot; i++) dis[i] = INF;
}
bool SPFA() {
  clear(), q.push_front(S), dis[S] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop_front();
    vis[x] = 0;
    for (int i = head[x]; i; i = g[i].nxt) {
      int v = g[i].to;
      if (g[i].w <= 0 || dis[x] + g[i].c >= dis[v]) continue;
      dis[v] = dis[x] + g[i].c;
      if (!vis[v]) {
        vis[v] = 1;
        if (!q.empty() && dis[q.front()] >= dis[v])
          q.push_front(v);
        else
          q.push_back(v);
      }
    }
  }
  return dis[T] != INF;
}
int dfs(int x, int Min) {
  if (x == T) return Min;
  vis[x] = 1;
  int flow = 0;
  for (int &i = cur[x]; i; i = g[i].nxt) {
    int v = g[i].to;
    if (dis[v] != dis[x] + g[i].c || g[i].w <= 0 || vis[v]) continue;
    int tmp = dfs(v, min(g[i].w, Min - flow));
    g[i].w -= tmp, g[i ^ 1].w += tmp, flow += tmp, Mincost += g[i].c * tmp;
    if (flow == Min) break;
  }
  return flow;
}
void Dinic() {
  while (SPFA()) dfs(S, INF);
}
void work() {
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) {
      if (len[j] > n - i + 1) continue;
      int flag = 1;
      for (int k = 1; k <= len[j]; k++)
        if (_s[j][k] != s[i + k - 1]) {
          flag = 0;
          break;
        }
      if (flag)
        sum += _q[j], ADD(id[i], id[i + len[j]], 1, _q[j]), ADD(S, id[i], 1, 0),
            ADD(id[i + len[j]], T, 1, 0);
    }
  Dinic();
  printf("%d\n", sum - Mincost);
}
int main() {
  init();
  work();
  return 0;
}
