#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double PI = acos(-1);
const double R = 0.57721566490153286060651209;
const int maxn = 1005;
struct Edge {
  int from, to, cap, flow, cost;
  Edge(int u, int v, int c, int f, int cc)
      : from(u), to(v), cap(c), flow(f), cost(cc) {}
};
struct MCMF {
  int n, m;
  vector<Edge> edges;
  vector<int> G[maxn];
  int inq[maxn];
  int d[maxn];
  int p[maxn];
  int a[maxn];
  void init(int n) {
    this->n = n;
    for (int i = 0; i <= n; ++i) G[i].clear();
    edges.clear();
  }
  void add(int from, int to, int cap, int cost) {
    edges.emplace_back(Edge(from, to, cap, 0, cost));
    edges.emplace_back(Edge(to, from, 0, 0, -cost));
    m = int(edges.size());
    G[from].emplace_back(m - 2);
    G[to].emplace_back(m - 1);
  }
  bool spfa(int s, int t, int &flow, int &cost) {
    for (int i = 1; i <= n; ++i) d[i] = INF;
    memset(inq, 0, sizeof(inq));
    d[s] = 0;
    inq[s] = 1;
    p[s] = 0;
    queue<int> q;
    a[s] = INF;
    q.push(s);
    while (!q.empty()) {
      int u = q.front();
      q.pop();
      inq[u] = 0;
      for (int i = 0; i < int(G[u].size()); ++i) {
        Edge &e = edges[G[u][i]];
        if (e.cap > e.flow && d[e.to] > d[u] + e.cost) {
          d[e.to] = d[u] + e.cost;
          p[e.to] = G[u][i];
          a[e.to] = min(a[u], e.cap - e.flow);
          if (!inq[e.to]) {
            q.push(e.to);
            inq[e.to] = 1;
          }
        }
      }
    }
    if (d[t] == INF) return false;
    flow += a[t];
    cost += d[t] * a[t];
    for (int u = t; u != s; u = edges[p[u]].from) {
      edges[p[u]].flow += a[t];
      edges[p[u] ^ 1].flow -= a[t];
    }
    return true;
  }
  int MincostMaxflow(int s, int t, int &cost) {
    int flow = 0;
    cost = 0;
    while (spfa(s, t, flow, cost))
      ;
    return flow;
  }
} mcmf;
int n, m, mincost;
void solve() {
  string S;
  cin >> S;
  cin >> n;
  map<int, int> num, mp[n + 1];
  vector<int> a(n + 1);
  for (int i = 0; i < S.length(); i++) {
    num[S[i] - 'a' + 1]++;
  }
  for (int i = 1; i <= n; i++) {
    string T;
    cin >> T >> a[i];
    for (int j = 0; j < T.length(); j++) {
      mp[i][T[j] - 'a' + 1]++;
    }
  }
  int s = 0, t = n + 26 + 1;
  mcmf.init(t);
  for (int i = 1; i <= 26; i++) {
    if (!num[i]) continue;
    mcmf.add(s, i, num[i], 0);
    for (int j = 1; j <= n; j++) {
      if (!mp[j][i]) continue;
      mcmf.add(i, j + 26, mp[j][i], j);
    }
  }
  for (int i = 1; i <= n; i++) {
    mcmf.add(i + 26, t, a[i], 0);
  }
  int maxflow = mcmf.MincostMaxflow(s, t, mincost);
  if (maxflow == S.length())
    cout << mincost << "\n";
  else
    cout << -1 << "\n";
}
signed main() {
  ios_base::sync_with_stdio(false);
  solve();
  return 0;
}
