#include <bits/stdc++.h>
using namespace std;
const int MN = 1010;
void radix_sort(int *A, int *B, int *C, int N, int M) {
  vector<int> D(M, 0);
  for (int i = 0; i < N; i++) D[B[A[i]]]++;
  for (int i = 1; i < M; i++) D[i] += D[i - 1];
  for (int i = N - 1; i >= 0; i--) C[--D[B[A[i]]]] = A[i];
}
int N;
string A, B[MN];
int C[MN], ord[MN][MN], invo[MN][MN], T[MN], psum[MN][11][MN], nxt[MN][10][MN];
int calc(int l, int r, int *psum) {
  if (l > r) return 0;
  return psum[r] - (l ? psum[l - 1] : 0);
}
int cc[MN][MN];
int dp(int len, int c) {
  int &ret = cc[len][c];
  if (ret != -1) return ret;
  if (len == MN - 1)
    return ret = calc(0, N - 1 - c, psum[len][0]) +
                 calc(N - c, N - 1, psum[len][1]);
  ret = 0;
  char t = A.size() < len ? '0' : A[(int)A.size() - len];
  if (t == '?') {
    for (int i = (len == A.size() ? 1 : 0); i <= 9; i++) {
      ret = max(ret, calc(0, N - 1 - c, psum[len][i]) +
                         calc(N - c, N - 1, psum[len][i + 1]) +
                         dp(len + 1, nxt[len][i][c]));
    }
  } else {
    ret = max(ret, calc(0, N - 1 - c, psum[len][t - '0']) +
                       calc(N - c, N - 1, psum[len][t - '0' + 1]) +
                       dp(len + 1, nxt[len][t - '0'][c]));
  }
  return ret;
}
int main() {
  std::ios::sync_with_stdio(false);
  cin >> A >> N;
  for (int i = 0; i < N; i++) {
    cin >> B[i];
  }
  for (int i = 0; i <= 9; i++) {
    cin >> C[i];
  }
  for (int i = 0; i < N; i++) ord[0][i] = i;
  for (int i = 1; i < MN; i++) {
    for (int j = 0; j < N; j++)
      T[j] = B[j].size() < i ? 0 : B[j][(int)B[j].size() - i] - '0';
    radix_sort(ord[i - 1], T, ord[i], N, 10);
  }
  for (int i = 0; i < MN; i++) {
    for (int j = 0; j < N; j++) invo[i][ord[i][j]] = j;
  }
  for (int i = 1; i < MN; i++) {
    for (int j = 0; j <= 10; j++) {
      for (int k = 0; k < N; k++) {
        int t = ord[i - 1][k];
        int v = B[t].size() < i ? 0 : B[t][(int)B[t].size() - i] - '0';
        if (B[t].size() < i && j == 0 && A.size() < i) {
          psum[i][j][k] = 0;
          if (k) psum[i][j][k] += psum[i][j][k - 1];
          continue;
        }
        psum[i][j][k] = C[(j + v) % 10];
        if (k) psum[i][j][k] += psum[i][j][k - 1];
      }
    }
  }
  for (int i = 1; i < MN; i++) {
    for (int j = 0; j <= 9; j++) {
      int pos = 0;
      for (int k = 0; k <= N; k++) {
        while (pos < N) {
          int t = ord[i][N - 1 - pos];
          int v = B[t].size() < i ? 0 : B[t][(int)B[t].size() - i] - '0';
          if (v + j + (invo[i - 1][t] >= N - k) >= 10)
            pos++;
          else
            break;
        }
        nxt[i][j][k] = pos;
      }
    }
  }
  memset(cc, -1, sizeof(cc));
  cout << dp(1, 0);
}
