#include <bits/stdc++.h>
using namespace std;
const int maxn = 1010;
const int inf = 1e7;
struct Edge {
  int to, cap, cost, rev;
};
int Dis[maxn], PreV[maxn], PreE[maxn];
int H[maxn];
vector<Edge> G[maxn];
void add(int from, int to, int cap, int cost) {
  G[from].push_back((Edge){to, cap, cost, (int)G[to].size()});
  G[to].push_back((Edge){from, 0, -cost, (int)G[from].size() - 1});
}
int min_cost_flow(int s, int t, int f) {
  int res = 0;
  fill(H, H + maxn, 0);
  while (f > 0) {
    fill(Dis, Dis + maxn, inf);
    Dis[s] = 0;
    priority_queue<pair<int, int>, vector<pair<int, int> >,
                   greater<pair<int, int> > >
        que;
    que.push({0, s});
    while (!que.empty()) {
      pair<int, int> p = que.top();
      que.pop();
      int v = p.second;
      if (Dis[v] < p.first) continue;
      for (int i = 0; i < G[v].size(); i++) {
        Edge &e = G[v][i];
        if (e.cap > 0 && Dis[e.to] > Dis[v] + e.cost + H[v] - H[e.to]) {
          Dis[e.to] = Dis[v] + e.cost + H[v] - H[e.to];
          PreE[e.to] = i;
          PreV[e.to] = v;
          que.push({Dis[e.to], e.to});
        }
      }
    }
    if (Dis[t] == inf) return -1;
    for (int v = 0; v < maxn; v++) {
      H[v] += Dis[v];
    }
    int d = f;
    for (int v = t; v != s; v = PreV[v]) {
      d = min(d, G[PreV[v]][PreE[v]].cap);
    }
    f -= d;
    res += d * H[t];
    for (int v = t; v != s; v = PreV[v]) {
      Edge &e = G[PreV[v]][PreE[v]];
      e.cap -= d;
      G[v][e.rev].cap += d;
    }
  }
  return res;
}
int n, m, k, cnt = 0;
int a[maxn], b[maxn], w[maxn];
string S;
vector<int> x;
int main() {
  cin >> n >> S >> m;
  for (int i = 1; i <= m; i++) {
    string tmp;
    int v;
    cin >> tmp >> v;
    int l = tmp.size();
    for (int j = 0; j < S.size(); j++) {
      if (S.substr(j, l) == tmp) {
        a[++cnt] = j, b[cnt] = j + l, w[cnt] = v;
        x.push_back(j), x.push_back(j + l);
      }
    }
  }
  cin >> k;
  sort(x.begin(), x.end());
  x.erase(unique(x.begin(), x.end()), x.end());
  int l = x.size(), s = l, t = s + 1;
  add(s, 0, k, 0);
  add(l - 1, t, k, 0);
  for (int i = 0; i < l - 1; i++) add(i, i + 1, inf, 0);
  for (int i = 1; i <= cnt; i++) {
    int u = find(x.begin(), x.end(), a[i]) - x.begin();
    int v = find(x.begin(), x.end(), b[i]) - x.begin();
    add(u, v, 1, -w[i]);
  }
  cout << -min_cost_flow(s, t, k);
  return 0;
}
