#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "YES" : "NO");
  exit(0);
}
void addmod(int &x, int y, int mod = 1000000007) {
  x += y;
  if (x >= mod) x -= mod;
  assert(x >= 0 && x < mod);
}
void et() {
  puts("-1");
  exit(0);
}
class MinCostFlow {
 public:
  int S, T, ecnt;
  int head[1000];
  int flw[10000], cost[10000], dis[1000];
  int to[10000], next[10000];
  bool use[1000];
  MinCostFlow() {
    memset(head, 0, sizeof(head));
    ecnt = 2;
  }
  void add_edge(int u, int v, int _c, int ww) {
    flw[ecnt] = _c;
    cost[ecnt] = ww;
    to[ecnt] = v;
    next[ecnt] = head[u];
    head[u] = ecnt++;
    flw[ecnt] = 0;
    cost[ecnt] = -ww;
    to[ecnt] = u;
    next[ecnt] = head[v];
    head[v] = ecnt++;
  }
  void SPFA() {
    for (int i = 1; i <= T; ++i) dis[i] = (1 << 29);
    priority_queue<pair<int, int> > Q;
    dis[S] = 0;
    Q.push(make_pair(0, S));
    while (!Q.empty()) {
      int u = Q.top().second, d = -Q.top().first;
      Q.pop();
      if (dis[u] != d) continue;
      for (int p = head[u]; p; p = next[p]) {
        int &v = to[p];
        if (flw[p] && dis[v] > d + cost[p]) {
          dis[v] = d + cost[p];
          Q.push(make_pair(-dis[v], v));
        }
      }
    }
    for (int i = 1; i <= T; ++i) dis[i] = dis[T] - dis[i];
  }
  int add_flow(int u, int flow, int &minCost) {
    if (u == T) {
      minCost += dis[S] * flow;
      return flow;
    }
    use[u] = true;
    int now = flow;
    for (int p = head[u]; p; p = next[p]) {
      int &v = to[p];
      if (flw[p] && !use[v] && dis[u] == dis[v] + cost[p]) {
        int tmp = add_flow(v, min(now, flw[p]), minCost);
        flw[p] -= tmp;
        flw[p ^ 1] += tmp;
        now -= tmp;
        if (!now) break;
      }
    }
    return flow - now;
  }
  bool modify_label() {
    int d = (1 << 29);
    for (int u = 1; u <= T; ++u)
      if (use[u])
        for (int p = head[u]; p; p = next[p]) {
          int &v = to[p];
          if (flw[p] && !use[v]) d = min(d, dis[v] + cost[p] - dis[u]);
        }
    if (d == (1 << 29)) return false;
    for (int i = 1; i <= T; ++i)
      if (use[i]) dis[i] += d;
    return true;
  }
  pair<int, int> minCostFlow(int s, int t) {
    S = s;
    T = t;
    SPFA();
    int flw = 0;
    int minCost = 0;
    while (true) {
      while (true) {
        for (int i = 1; i <= T; ++i) use[i] = 0;
        int tt = add_flow(S, (1 << 29), minCost);
        flw += tt;
        if (!tt) break;
      }
      if (!modify_label()) break;
    }
    return {flw, minCost};
  }
};
char s[535], ts[535];
void fmain() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  MinCostFlow mf = MinCostFlow();
  int S = 1, T = n + 2;
  scanf("%d", &m);
  for (int(i) = 0; (i) < (int)(m); (i)++) {
    int p;
    scanf("%s%d", ts + 1, &p);
    int len = strlen(ts + 1);
    for (int j = 1; j + len - 1 <= n; j++) {
      bool ok = 1;
      for (int k = j; k <= j + len - 1; k++) {
        if (s[k] != ts[k + 1 - j]) {
          ok = 0;
          break;
        }
      }
      if (ok) mf.add_edge(j + 1, j + len + 1, 1, -p);
    }
  }
  int X;
  scanf("%d", &X);
  for (int i = S; i < T; i++) {
    mf.add_edge(i, i + 1, X, 0);
  }
  auto pp = mf.minCostFlow(S, T);
  printf("%d\n", -pp.second);
}
int main() {
  fmain();
  return 0;
}
