#include <bits/stdc++.h>   using namespace std;   inline void read(int &x) {     int v = 0, f = 1;     char c = getchar();     while (!isdigit(c) && c !=  - ) c = getchar();     if (c ==  - )       f = -1;     else       v = v * 10 + c -  0 ;     while (isdigit(c = getchar())) v = v * 10 + c -  0 ;     x = v * f;   }   inline void read(long long &x) {     long long v = 0ll, f = 1ll;     char c = getchar();     while (!isdigit(c) && c !=  - ) c = getchar();     if (c ==  - )       f = -1;     else       v = v * 10 + c -  0 ;     while (isdigit(c = getchar())) v = v * 10 + c -  0 ;     x = v * f;   }   inline void readc(char &x) {     char c;     while ((c = getchar()) ==    )       ;     x = c;   }   inline void writes(string s) { puts(s.c_str()); }   inline void writeln() { writes(  ); }   inline void writei(int x) {     if (x < 0) {       putchar( - );       x = abs(x);     }     if (!x) putchar( 0 );     char a[25];     int top = 0;     while (x) {       a[++top] = (x % 10) +  0 ;       x /= 10;     }     while (top) {       putchar(a[top]);       top--;     }   }   inline void writell(long long x) {     if (x < 0) {       putchar( - );       x = abs(x);     }     if (!x) putchar( 0 );     char a[25];     int top = 0;     while (x) {       a[++top] = (x % 10) +  0 ;       x /= 10;     }     while (top) {       putchar(a[top]);       top--;     }   }   int n, m, i, j, v, dis[505], cnt, cst, vis[505];   string st, s;   struct edg {     int y, z, d;   } ee[18005];   vector<int> e[505];   void add(int x, int y, int z, int d) {     cnt++;     e[x].push_back(cnt * 2 - 2);     e[y].push_back(cnt * 2 - 1);     ee[cnt * 2 - 2] = (edg){y, z, d};     ee[cnt * 2 - 1] = (edg){x, 0, -d};   }   bool bfs(int s, int t) {     memset(dis, -18, sizeof(dis));     dis[s] = 0;     queue<int> q;     q.push(s);     while (!q.empty()) {       int x = q.front();       q.pop();       for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end();            it++) {         if (ee[*it].z == 0) continue;         int y = ee[*it].y, z = dis[x] + ee[*it].d;         if (dis[y] < z) {           dis[y] = z;           q.push(y);         }       }     }     return dis[t] > dis[504];   }   int dfs(int x, int t, int flw) {     if (!flw || (x != t && vis[x])) return 0;     if (x == t) {       vis[x] = 1;       return flw;     }     vis[x] = 1;     int ans = 0;     for (__typeof((e[x]).begin()) it = (e[x]).begin(); it != (e[x]).end(); it++) {       if (ee[*it].z == 0) continue;       int y = ee[*it].y;       if (dis[y] == dis[x] + ee[*it].d) {         int tt = dfs(y, t, min(flw, ee[*it].z));         ans += tt;         flw -= tt;         ee[*it].z -= tt;         ee[(*it) ^ 1].z += tt;         cst += tt * ee[*it].d;       }     }     return ans;   }   int dinic(int s, int t) {     int ans = 0;     while (bfs(s, t)) {       do {         memset(vis, 0, sizeof(vis));         ans += dfs(s, t, 0x3bbbbbbb);       } while (vis[t]);     }     return cst;   }   int main() {     ios_base::sync_with_stdio(false);     ;     cin >> n >> st >> m;     st =     + st;     for (((i)) = (1); ((i)) <= ((n)); ((i))++) add(i, i + 1, 0x3bbbbbbb, 0);     while (m--) {       cin >> s >> v;       for (((i)) = (1); ((i)) <= ((n - ((int)(s.length())) + 1)); ((i))++) {         if (st.substr(i, s.length()) == s) {           add(i, i + s.length(), 1, v);         }       }     }     cin >> v;     add(0, 1, v, 0);     cout << dinic(0, n + 1) << endl;     return 0;   }