#include <bits/stdc++.h>
using namespace std;
void out() {
  cout.flush();
  cerr << endl << "OUT" << endl;
  int bred;
  cin >> bred;
  exit(0);
}
void updMax(int& x, int y) {
  if (y > x) x = y;
}
int sum10(int x, int y) {
  x += y;
  if (x >= 10) x -= 10;
  return x;
}
int cs[10];
int n, m;
string a, bs[1024];
int dp[1024][1024], sorted[1024][1024], h[10], whereGo[1024][10], res[1024][10],
    curc[1024];
int getCipher(const string& s, int ind) {
  if (ind >= s.length()) return 0;
  return s[ind] - '0';
}
void buildSorted() {
  for (int j = 0; j < n; ++j) sorted[0][j] = j;
  for (int i = 0; i < 1002; ++i) {
    memset(h, 0, sizeof(h));
    for (int j = 0; j < n; ++j) h[getCipher(bs[j], i)]++;
    for (int j = 1; j < 10; ++j) h[j] += h[j - 1];
    for (int j = n - 1; j >= 0; --j) {
      int v = sorted[i][j];
      sorted[i + 1][--h[getCipher(bs[v], i)]] = v;
    }
  }
}
int ps[1024], qs[1024], revps[1024], revqs[1024];
void calcWhereGo(int pos) {
  for (int i = 0; i < n; ++i) {
    ps[i] = sorted[pos][i];
    qs[i] = sorted[pos + 1][i];
    revps[ps[i]] = i;
    revqs[qs[i]] = i;
  }
  for (int c = 0; c <= 9; ++c) {
    int curper = n;
    for (int i = 0; i < n; ++i)
      if (getCipher(bs[ps[i]], pos) + c >= 10)
        curper = min(curper, revqs[ps[i]]);
    whereGo[n][c] = curper;
    for (int i = n - 1; i >= 0; --i) {
      if (getCipher(bs[ps[i]], pos) + c + 1 >= 10)
        curper = min(curper, revqs[ps[i]]);
      whereGo[i][c] = curper;
    }
  }
}
void calcRes(int pos) {
  for (int c = 0; c <= 9; ++c) {
    int sum = 0;
    for (int i = 0; i < n; ++i) {
      curc[i] = sum10(getCipher(bs[sorted[pos][i]], pos), c);
      if (curc[i] == 0 && pos >= bs[sorted[pos][i]].length())
        curc[i] = 0;
      else
        curc[i] = cs[curc[i]];
      sum += curc[i];
    }
    res[n][c] = sum;
    int cc = sum10(c, 1);
    for (int i = n - 1; i >= 0; --i) {
      sum -= curc[i];
      curc[i] = sum10(getCipher(bs[sorted[pos][i]], pos), cc);
      sum += cs[curc[i]];
      res[i][c] = sum;
    }
  }
}
void calcDynamics() {
  for (int i = 0; i <= 1001; ++i)
    for (int j = 0; j <= n; ++j) dp[i][j] = -1000000000;
  dp[0][n] = 0;
  for (int i = 0; i <= 1000; ++i) {
    calcWhereGo(i);
    calcRes(i);
    int l, r;
    if (i >= m)
      l = r = 0;
    else if (a[i] == '?') {
      r = 9;
      l = (i == m - 1);
    } else
      l = r = a[i] - '0';
    for (int j = 0; j <= n; ++j)
      for (int c = l; c <= r; ++c)
        updMax(dp[i + 1][whereGo[j][c]], dp[i][j] + res[j][c]);
  }
}
void solve() {
  cin >> a >> n;
  reverse(a.begin(), a.end());
  m = a.length();
  for (int i = 0; i < n; ++i) {
    cin >> bs[i];
    reverse(bs[i].begin(), bs[i].end());
    while (bs[i].length() < m) bs[i].push_back('0');
  }
  for (int i = 0; i < 10; ++i) cin >> cs[i];
  buildSorted();
  calcDynamics();
  int ans = 0;
  for (int i = 0; i <= n; ++i) ans = max(ans, dp[1001][i]);
  cout << ans << "\n";
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
  out();
  return 0;
}
