#include <bits/stdc++.h>
using namespace std;
const int maxN = 500 + 10;
const int INF = (int)1e9 + 7;
class MaxFlowMinCost {
 private:
  struct Edge {
    int from, to, capa, flow, cost;
    Edge() { from = to = capa = flow = cost = 0; }
    Edge(int u, int v, int ca, int co) {
      from = u;
      to = v;
      capa = ca;
      flow = 0;
      cost = co;
    }
    int residental(void) const { return (capa - flow); }
  };
  int n;
  vector<vector<int> > adj;
  vector<Edge> edge;
  vector<int> dist, trace;
  bool FordBellman(int s, int t) {
    fill(dist.begin(), dist.end(), INF);
    fill(trace.begin(), trace.end(), -1);
    vector<bool> inQueue(n + 7, false);
    queue<int> q;
    dist[s] = 0;
    q.push(s);
    inQueue[s] = true;
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      inQueue[u] = false;
      for (__typeof((adj[u]).begin()) it = (adj[u]).begin();
           it != (adj[u]).end(); it++)
        if (edge[*it].residental() > 0) {
          int v = edge[*it].to;
          if (dist[v] > dist[u] + edge[*it].cost) {
            dist[v] = dist[u] + edge[*it].cost;
            trace[v] = *it;
            if (!inQueue[v]) {
              q.push(v);
              inQueue[v] = true;
            }
          }
        }
    }
    return (dist[t] < INF);
  }

 public:
  MaxFlowMinCost() { n = 0; }
  MaxFlowMinCost(int n) {
    this->n = n;
    adj.assign(n + 7, vector<int>());
    dist.assign(n + 7, 0);
    trace.assign(n + 7, 0);
  }
  void addEdge(int u, int v, int ca, int co) {
    adj[u].push_back(edge.size());
    edge.push_back(Edge(u, v, ca, co));
    adj[v].push_back(edge.size());
    edge.push_back(Edge(v, u, 0, -co));
  }
  pair<int, int> getFlow(int s, int t) {
    int totFlow = 0;
    int totCost = 0;
    while (FordBellman(s, t)) {
      int delta = INF;
      for (int u = t; u != s; u = edge[trace[u]].from)
        delta = min(delta, edge[trace[u]].residental());
      for (int u = t; u != s; u = edge[trace[u]].from) {
        edge[trace[u]].flow += delta;
        edge[trace[u] ^ 1].flow -= delta;
      }
      totFlow += delta;
      totCost += delta * dist[t];
    }
    return (make_pair(totFlow, totCost));
  }
};
int n, m;
char s[maxN], X[maxN];
int main() {
  scanf("%d", &n);
  scanf("%s", s + 1);
  MaxFlowMinCost mcmf(n + 2);
  scanf("%d", &m);
  for (int i = 0; i < m; i++) {
    scanf("%s", X);
    int p, np = strlen(X);
    scanf("%d", &p);
    for (int pp = 1; pp <= n - np + 1; pp++) {
      bool eq = true;
      for (int j = 0; j < np; j++)
        if (s[pp + j] != X[j]) {
          eq = false;
          break;
        }
      if (eq) {
        mcmf.addEdge(pp, pp + np, 1, -p);
      }
    }
  }
  int x;
  scanf("%d", &x);
  for (int i = 0; i <= n; i++) {
    mcmf.addEdge(i, i + 1, x, 0);
  }
  printf("%d\n", -mcmf.getFlow(0, n + 1).second);
  return 0;
}
