#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int u, v, cap, cost, next;
} edge[555 * 1111];
int head[555];
int NV, NE, vs, vt;
void addEdge(int u, int v, int cap, int cost) {
  edge[NE].u = u;
  edge[NE].v = v;
  edge[NE].cap = cap;
  edge[NE].cost = cost;
  edge[NE].next = head[u];
  head[u] = NE++;
  edge[NE].u = v;
  edge[NE].v = u;
  edge[NE].cap = 0;
  edge[NE].cost = -cost;
  edge[NE].next = head[v];
  head[v] = NE++;
}
bool vis[555];
int d[555], pre[555];
bool SPFA() {
  for (int i = 0; i < NV; ++i) {
    vis[i] = 0;
    d[i] = (1 << 30);
  }
  vis[vs] = 1;
  d[vs] = 0;
  queue<int> que;
  que.push(vs);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    for (int i = head[u]; i != -1; i = edge[i].next) {
      int v = edge[i].v;
      if (edge[i].cap && d[v] > d[u] + edge[i].cost) {
        d[v] = d[u] + edge[i].cost;
        pre[v] = i;
        if (!vis[v]) {
          vis[v] = 1;
          que.push(v);
        }
      }
    }
    vis[u] = 0;
  }
  return d[vt] != (1 << 30);
}
int MCMF() {
  int res = 0;
  while (SPFA()) {
    int flow = (1 << 30), cost = 0;
    for (int u = vt; u != vs; u = edge[pre[u]].u) {
      flow = min(flow, edge[pre[u]].cap);
    }
    for (int u = vt; u != vs; u = edge[pre[u]].u) {
      edge[pre[u]].cap -= flow;
      edge[pre[u] ^ 1].cap += flow;
      cost += flow * edge[pre[u]].cost;
    }
    res += cost;
  }
  return res;
}
int tn, ch[55500][26], fail[55500];
vector<int> vec[55500];
void insert(char *s, int k) {
  int x = 0;
  for (int i = 0; s[i]; ++i) {
    int y = s[i] - 'a';
    if (ch[x][y] == 0) ch[x][y] = ++tn;
    x = ch[x][y];
  }
  vec[x].push_back(k);
}
void getfail() {
  queue<int> que;
  for (int i = 0; i < 26; ++i) {
    if (ch[0][i]) que.push(ch[0][i]);
  }
  while (!que.empty()) {
    int x = que.front();
    que.pop();
    for (int i = 0; i < 26; ++i) {
      if (ch[x][i]) {
        fail[ch[x][i]] = ch[fail[x]][i];
        que.push(ch[x][i]);
      } else
        ch[x][i] = ch[fail[x]][i];
    }
  }
}
int val[111], len[111];
void ac(char *s) {
  int x = 0;
  for (int i = 0; s[i]; ++i) {
    int y = s[i] - 'a';
    x = ch[x][y];
    for (int tmp = x; tmp; tmp = fail[tmp]) {
      for (int j = 0; j < vec[tmp].size(); ++j) {
        int k = vec[tmp][j];
        addEdge(i - len[k] + 1, i + 1, 1, -val[k]);
      }
    }
  }
}
char S[555], T[555];
int main() {
  int n, m, x;
  scanf("%d%s%d", &n, S, &m);
  for (int i = 1; i <= m; ++i) {
    scanf("%s%d", T, val + i);
    len[i] = strlen(T);
    insert(T, i);
  }
  scanf("%d", &x);
  vs = n + 1;
  vt = vs + 1;
  NV = vt + 1;
  NE = 0;
  memset(head, -1, sizeof(head));
  addEdge(vs, 0, x, 0);
  addEdge(n, vt, x, 0);
  for (int i = 1; i <= n; ++i) {
    addEdge(i - 1, i, (1 << 30), 0);
  }
  getfail();
  ac(S);
  printf("%d", -MCMF());
  return 0;
}
