#include <bits/stdc++.h>
using namespace std;
template <typename Arg1>
void __f(const char* name, Arg1&& arg1) {
  cerr << name << " : " << arg1 << std::endl;
}
template <typename Arg1, typename... Args>
void __f(const char* names, Arg1&& arg1, Args&&... args) {
  const char* comma = strchr(names + 1, ',');
  cerr.write(names, comma - names) << " : " << arg1 << " | ";
  __f(comma + 1, args...);
}
namespace Circu {
const int MAXV = 1000100, MAXE = 1000100;
int how[MAXV], good[MAXV], bio[MAXV], cookie = 1, to[MAXE];
int from[MAXE], V, E;
long long int cap[MAXE], cost[MAXE], dist[MAXV];
void init(int n) {
  V = n;
  E = 0;
}
void AddEdge(int x, int y, long long int c, long long int w) {
  from[E] = x;
  to[E] = y;
  cap[E] = c;
  cost[E] = +w;
  ++E;
  from[E] = y;
  to[E] = x;
  cap[E] = 0;
  cost[E] = -w;
  ++E;
}
void reset() {
  for (int i = (0); i < (V); ++i) dist[i] = 0, how[i] = -1;
}
bool relax() {
  bool ret = false;
  for (int e = (0); e < (E); ++e)
    if (cap[e]) {
      int x = from[e], y = to[e];
      if (dist[x] + cost[e] < dist[y]) {
        dist[y] = dist[x] + cost[e];
        how[y] = e;
        ret = true;
      }
    }
  return ret;
}
long long int cycle(int s, bool flip = false) {
  int x = s;
  long long int c = cap[how[x]];
  do {
    int e = how[x];
    c = min(c, cap[e]);
    x = from[e];
  } while (x != s);
  long long int sum = 0;
  do {
    int e = how[x];
    if (flip) {
      cap[e] -= c;
      cap[e ^ 1] += c;
    }
    sum += cost[e] * c;
    x = from[e];
  } while (x != s);
  return sum;
}
long long int push(int x) {
  for (++cookie; bio[x] != cookie; x = from[how[x]]) {
    if (!good[x] || how[x] == -1 || cap[how[x]] == 0) return 0;
    bio[x] = cookie;
    good[x] = false;
  }
  return cycle(x) >= 0 ? 0 : cycle(x, true);
}
long long int run() {
  reset();
  long long int ret = 0;
  for (int step = (0); step < (2 * V); ++step) {
    if (step == V) reset();
    if (!relax()) continue;
    for (int i = (0); i < (V); ++i) good[i] = true;
    for (int i = (0); i < (V); ++i)
      if (long long int w = push(i)) ret += w, step = 0;
  }
  return ret;
}
}  // namespace Circu
const int N = 505;
const int MAX = int(1e5) + 10;
int nfa[N];
void build_NFA(string& s) {
  nfa[0] = 0;
  int x = 0, n = (int)(s.size());
  for (int i = 1; i <= n; i++) {
    nfa[i] = x;
    while (i != n) {
      if (s[x] == s[i]) {
        x++;
        break;
      }
      if (!x) break;
      x = nfa[x];
    }
  }
}
int kmp_search(int start, string& P, string& T) {
  for (int i = start, x = 0; i < (int)(T.size());) {
    if (T[i] == P[x])
      x++, i++;
    else if (!x)
      i++;
    else
      x = nfa[x];
    if (x == (int)(P.size())) return i - (int)(P.size());
  }
  return -1;
}
string s;
int L[MAX], R[MAX], C[MAX], len, deg[N];
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  int n;
  cin >> n;
  cin >> s;
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    string t;
    int c;
    cin >> t >> c;
    int ans = 0;
    build_NFA(t);
    while ((ans = kmp_search(ans, t, s)) != -1) {
      L[len] = ans, R[len] = ans + (int)(t.size()), C[len] = c;
      len++;
      ans += (int)(t.size()) - nfa[(int)(t.size())];
    }
  }
  int x;
  cin >> x;
  Circu::init(n + 1);
  for (int i = 0; i < len; i++) {
    Circu::AddEdge(R[i], L[i], 1, -C[i]);
  }
  for (int i = 1; i <= n; i++) Circu::AddEdge(i - 1, i, x, 0);
  long long int ans = Circu::run();
  cout << -ans << endl;
  return 0;
}
