#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int m, n[N], len[N], a[N][N], W[10], c[10], now[N], pre[N], f[N], dp[N][N], ans;
char s[N];
int main() {
  scanf("%s%d", s, &m), len[0] = strlen(s);
  for (int i = 1; i <= len[0]; i++)
    n[i] = s[len[0] - i] == '?' ? -1 : s[len[0] - i] - '0';
  for (int i = 1; i <= m; i++) {
    pre[i] = i;
    scanf("%s", s), len[i] = strlen(s);
    for (int j = 1; j <= len[i]; j++) a[i][j] = s[len[i] - j] - '0';
  }
  for (int i = 0; i <= 9; i++) scanf("%d", &W[i]);
  memset(dp, -1, sizeof dp), dp[0][m + 1] = 0;
  for (int i = 1; i <= len[0]; i++) {
    for (int j = 0; j <= 9; j++) c[j] = 0;
    for (int j = 1; j <= m; j++) c[a[pre[j]][i]]++;
    for (int j = 1; j <= 9; j++) c[j] += c[j - 1];
    for (int j = m; j; j--)
      now[c[a[pre[j]][i]]] = pre[j], f[pre[j]] = c[a[pre[j]][i]]--;
    int l = ~n[i] ? n[i] : i == len[0], r = ~n[i] ? n[i] : 9;
    for (int x = l; x <= r; x++) {
      int pos = m + 1, w = 0;
      for (int j = m; j; j--) {
        w += W[(a[now[j]][i] + x) % 10];
        if (a[now[j]][i] + x >= 10) pos = j;
      }
      if (~dp[i - 1][m + 1]) dp[i][pos] = max(dp[i][pos], dp[i - 1][m + 1] + w);
      for (int j = m; j; j--) {
        int _ = a[pre[j]][i] + x;
        w += W[(_ + 1) % 10] - W[_ % 10];
        if (_ + 1 >= 10) pos = min(pos, f[pre[j]]);
        if (~dp[i - 1][j]) dp[i][pos] = max(dp[i][pos], dp[i - 1][j] + w);
      }
    }
    swap(now, pre);
  }
  int w = 0;
  for (int i = 1; i <= m; i++)
    for (int j = len[0] + 1; j <= len[i]; j++) w += W[a[i][j]];
  if (~dp[len[0]][m + 1]) ans = max(ans, dp[len[0]][m + 1] + w);
  for (int i = m; i; i--) {
    for (int j = len[0] + 1; j <= len[pre[i]]; j++) w -= W[a[pre[i]][j]];
    int x = 1;
    for (int j = len[0] + 1; j <= len[pre[i]] || x; j++)
      w += W[(a[pre[i]][j] + x) % 10], x = (a[pre[i]][j] + x) / 10;
    if (~dp[len[0]][i]) ans = max(ans, dp[len[0]][i] + w);
  }
  return cout << ans << endl, 0;
}
