#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e9;
struct MCF {
  int n;
  vector<long long> prio, pot;
  vector<long long> curflow;
  vector<int> prevedge, prevnode;
  priority_queue<pair<long long, int>, vector<pair<long long, int>>,
                 greater<pair<long long, int>>>
      q;
  struct edge {
    int to, rev;
    long long f, cap;
    long long cost;
  };
  vector<vector<edge>> g;
  MCF(int n)
      : n(n), prio(n), curflow(n), prevedge(n), prevnode(n), pot(n), g(n) {}
  void add_edge(int s, int t, long long cap, long long cost) {
    g[s].push_back((edge){t, ((int)g[t].size()), 0, cap, cost});
    g[t].push_back((edge){s, ((int)g[s].size()) - 1, 0, 0, -cost});
  }
  pair<long long, long long> get_flow(int s, int t) {
    long long flow = 0;
    long long flowcost = 0;
    while (1) {
      q.push({0, s});
      fill(prio.begin(), prio.end(), INF);
      prio[s] = 0;
      curflow[s] = INF;
      while (!q.empty()) {
        auto cur = q.top();
        long long d = cur.first;
        int u = cur.second;
        q.pop();
        if (d != prio[u]) continue;
        for (int i = 0; i < ((int)g[u].size()); ++i) {
          edge &e = g[u][i];
          int v = e.to;
          if (e.cap <= e.f) continue;
          long long nprio = prio[u] + e.cost + pot[u] - pot[v];
          if (prio[v] > nprio) {
            prio[v] = nprio;
            q.push({nprio, v});
            prevnode[v] = u;
            prevedge[v] = i;
            curflow[v] = min(curflow[u], e.cap - e.f);
          }
        }
      }
      if (prio[t] == INF) break;
      for (int i = 0; i < n; i++) pot[i] += prio[i];
      long long df = min(curflow[t], INF - flow);
      flow += df;
      for (int v = t; v != s; v = prevnode[v]) {
        edge &e = g[prevnode[v]][prevedge[v]];
        e.f += df;
        g[v][e.rev].f -= df;
        flowcost += df * e.cost;
      }
    }
    return {flow, flowcost};
  }
};
int main() {
  int n, m, x;
  string s;
  cin >> n >> s >> m;
  string t[m];
  int points[m];
  for (int i = 0; i < m; i++) cin >> t[i] >> points[i];
  cin >> x;
  int N = 2 * n;
  MCF mcf(N + 2);
  mcf.add_edge(N, 0, x, 0);
  for (int i = 0; i < n; i++) {
    if (i < n - 1) mcf.add_edge(i, i + 1, INF, 0);
    mcf.add_edge(i, i + n, INF, 0);
    mcf.add_edge(i + n, N + 1, 1, 0);
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) {
      if (s.substr(i, ((int)t[j].size())) == t[j]) {
        if (i + ((int)t[j].size()) == n)
          mcf.add_edge(i + n, N + 1, 1, -points[j]);
        else
          mcf.add_edge(i + n, i + ((int)t[j].size()), 1, -points[j]);
      }
    }
  auto p = mcf.get_flow(N, N + 1);
  cout << -p.second << endl;
  return 0;
}
