#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v, cap, cost;
} E[1000000];
const int oo = 1 << 29;
int N, e, p[505], cost[505];
void addEdge(int a, int b, int c, int d) {
  E[e].u = a;
  E[e].v = b;
  E[e].cap = c;
  E[e].cost = d;
  ++e;
  E[e].u = b;
  E[e].v = a;
  E[e].cap = 0;
  E[e].cost = -d;
  ++e;
}
bool getPath(int src, int sink) {
  for (int i = 0; i < N; ++i) cost[i] = oo;
  cost[src] = 0;
  bool upd = true;
  for (int it = 1; upd && it < N; ++it)
    for (int i = upd = 0; i < e; ++i)
      if (E[i].cap > 0 && cost[E[i].u] != oo &&
          cost[E[i].v] > cost[E[i].u] + E[i].cost) {
        cost[E[i].v] = cost[E[i].u] + E[i].cost;
        p[E[i].v] = i;
        upd = true;
      }
  return cost[sink] != oo;
}
pair<int, int> maxFlowMinCost(int src, int sink) {
  int maxFlow = 0, minCost = 0;
  while (getPath(src, sink)) {
    int flow = 1e9;
    for (int c = sink; c != src; c = E[p[c]].u) flow = min(flow, E[p[c]].cap);
    for (int c = sink; c != src; c = E[p[c]].u) {
      E[p[c]].cap -= flow;
      E[p[c] ^ 1].cap += flow;
    }
    maxFlow += flow;
    minCost += cost[sink] * flow;
  }
  return make_pair(maxFlow, minCost);
}
string s, w[100];
int main() {
  int n, m, x;
  scanf("%d", &n);
  cin >> s;
  int src = n + 1, sink = n + 2;
  N = sink + 1;
  scanf("%d", &m);
  int val;
  for (int i = 0; i < m; ++i) {
    cin >> w[i] >> val;
    for (int j = 0; j + w[i].size() <= s.size(); ++j)
      if (s.substr(j, w[i].size()) == w[i])
        addEdge(j, j + w[i].size(), 1, -val);
  }
  scanf("%d", &x);
  for (int i = 0; i < n; ++i) addEdge(i, i + 1, x, 0);
  addEdge(src, 0, x, 0);
  addEdge(n, sink, x, 0);
  assert(e < 1000000);
  printf("%d\n", -maxFlowMinCost(src, sink).second);
  return 0;
}
