#include <bits/stdc++.h>
using namespace std;
const int N = 500 + 10;
int n;
char s[N];
char t[2 * N];
int k;
int z[2 * N];
void z_function(char s[], int n) {
  for (int(i) = 0; (i) < (int)(n); ++(i)) {
    z[i] = 0;
  }
  int l = 0, r = 0;
  for (int(i) = 1; (i) <= (int)(n - 1); ++(i)) {
    if (i <= r) {
      z[i] = min(r - i + 1, z[i - l]);
    }
    while (i + z[i] < n && s[i + z[i]] == s[z[i]]) {
      ++z[i];
    }
    if (i + z[i] - 1 > r) {
      l = i, r = i + z[i] - 1;
    }
  }
}
int tope;
const int M = 510 * 110 * 2;
int v[M], to[M], u[M], c[M], ne[M], f[M];
int la[N];
int so, si;
void add_edge(int V, int TO, int U, int C) {
  v[tope] = V, to[tope] = TO, u[tope] = U, c[tope] = C, ne[tope] = la[V];
  la[V] = tope++;
  v[tope] = TO, to[tope] = V, u[tope] = 0, c[tope] = -C, ne[tope] = la[TO];
  la[TO] = tope++;
}
int qu[N];
bool inQu[N];
int d[N];
const int INF = 1000000000;
int path[N];
int bellman(int n) {
  int b = 0, e = 0;
  for (int(i) = 0; (i) < (int)(n); ++(i)) {
    inQu[i] = false;
    d[i] = INF;
    path[i] = -1;
  }
  qu[e++] = so;
  d[so] = 0;
  inQu[so] = true;
  while (b != e) {
    int v = qu[b++];
    inQu[v] = false;
    if (b == N) {
      b = 0;
    }
    for (int in = la[v]; in != -1; in = ne[in]) {
      int to = ::to[in];
      if (f[in] < u[in] && d[to] > d[v] + c[in]) {
        d[to] = d[v] + c[in];
        path[to] = in;
        if (!inQu[to]) {
          qu[e++] = to;
          if (e == N) {
            e = 0;
          }
          inQu[to] = true;
        }
      }
    }
  }
  return d[si];
}
int minCostFlow(int k, int n) {
  int res = 0;
  for (int(i) = 1; (i) <= (int)(k); ++(i)) {
    res += bellman(n);
    int cr = si;
    while (cr != so) {
      int in = path[cr];
      ++f[in];
      --f[in ^ 1];
      cr = v[in];
    }
  }
  return res;
}
void solve() {
  memset(la, -1, sizeof la);
  scanf("%d", &n);
  scanf("%s", s);
  int m;
  scanf("%d", &m);
  for (int(it) = 0; (it) < (int)(m); ++(it)) {
    int p;
    scanf("%s%d", t, &p);
    int l = strlen(t);
    for (int(i) = 0; (i) < (int)(n); ++(i)) {
      t[l + i] = s[i];
    }
    z_function(t, l + n);
    for (int(i) = 0; (i) < (int)(n); ++(i)) {
      if (z[l + i] >= l) {
        add_edge(i, i + l, 1, -p);
      }
    }
  }
  scanf("%d", &k);
  so = 0, si = n;
  for (int(i) = 0; (i) < (int)(n); ++(i)) {
    add_edge(i, i + 1, k, 0);
  }
  printf("%d\n", -minCostFlow(k, si + 1));
}
int main() {
  solve();
  return 0;
}
