#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<string>
#include<algorithm>
#define FOR(i,a,b) for(i=(a);i<=(b);i++)
#define ROF(i,a,b) for(i=(a);i>=(b);i--)
#define mmt(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define mp make_pair
#define M 3001000
#define N 100010
#define MaxL 1000000
#define MOD 1253599
using namespace std;
typedef long long LL;
typedef long double LD;
struct edge{int x,y;bool operator==(const edge A){return x==A.x&&y==A.y;}}E[2*M];
char s[N][11],ts[11];int cost[10],e[M],w[M],last[N],pre[M],q[MaxL+100],dis[N],len=0,n,tot;bool inq[N];
string st[N];int inf;int _last[MOD],_len=0,_pre[N],_w[N];LL _e[N],Pow[N];
void add(int x,int y,int z)
{pre[++len]=last[x];last[x]=len;e[len]=y;w[len]=z;}
bool cmp(const char *s1,const char *s2){return strcmp(s1,s2)<0;}
bool _cmp(edge a,edge b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
int Nxt(int x){if (x+1==MaxL) return 1;return x+1;}
int Pre(int x){if (x<1) return MaxL-1;return x-1;}
void SPFA(int v0)
{
  int h=0,t=1;q[1]=v0;
  mmt(dis,0x5f);mmt(inq,0);inf=dis[v0];dis[v0]=0;
  while (h!=t)
  {
    h=Nxt(h);int u=q[h];
    for(int p=last[u];p;p=pre[p])
    {
      int v=e[p],W=w[p];
      if (dis[u]+W<dis[v])
      {
        dis[v]=dis[u]+W;
        if (!inq[v]) 
        {
          if (dis[v]>dis[q[h]]) {t=Nxt(t);q[t]=v;}
          else {h=Pre(h);q[h]=v;}
          inq[v]=1;
        }
      }
    }
    inq[u]=0;
  }
}
void Ins(LL x,int i)
{
  int tt=x%MOD;
  _pre[++_len]=_last[tt];_last[tt]=_len;_e[_len]=x;_w[_len]=i;
}
int ask(LL x)
{
  int tt=x%MOD;
  for(int p=_last[tt];p;p=_pre[p])
   if (_e[p]==x) return _w[p];
  return 0;
}
int main()
{
  ios::sync_with_stdio(false);
  scanf("%d",&n);int i,j,ss,tt,p1,p2;char k;char S[11],T[11];
  FOR(i,1,10) scanf("%d",&cost[i-1]);
  FOR(i,1,n)
  {
    scanf("%s",s[i]);
    st[i]=s[i];
  }
  memcpy(S,s[1],sizeof(s[1]));
  memcpy(T,s[n],sizeof(s[n]));
  sort(st+1,st+1+n);
  Pow[9]=1;ROF(i,8,0) Pow[i]=Pow[i+1]*10;
  FOR(i,1,n) 
  {
    LL num=0;
    FOR(j,0,9) s[i][j]=st[i][j],num+=Pow[j]*(s[i][j]-'0');
    Ins(num,i);
  }
  FOR(i,1,n) 
   if (!strcmp(S,s[i])) ss=i;
   else if (!strcmp(T,s[i])) tt=i;
  FOR(i,1,n)
  {
    LL num=0;
    FOR(j,0,9) num+=(s[i][j]-'0')*Pow[j];
    FOR(j,0,9)
    {
      char c=s[i][j];
      FOR(k,'0','9') 
      {
        if (k!=c) 
        {
          num-=(s[i][j]-'0')*Pow[j],num+=(k-'0')*Pow[j];
          int p=ask(num);
          if (p) E[++tot].x=i,E[tot].y=p;
          num+=(s[i][j]-'0')*Pow[j],num-=(k-'0')*Pow[j];
        }
      }
    }
  }
  FOR(i,1,n) 
  {
    LL num=0;
    FOR(j,0,9) num+=(s[i][j]-'0')*Pow[j];
    memcpy(ts,s[i],sizeof(s[i]));
    FOR(p1,0,9) FOR(p2,0,9)
    {
      if (p1!=p2)
      {
        num-=(ts[p1]-'0')*Pow[p1],num+=(ts[p2]-'0')*Pow[p1];
        num-=(ts[p2]-'0')*Pow[p2],num+=(ts[p1]-'0')*Pow[p2];
        int p=ask(num);
        if (p&&i!=p) E[++tot].x=i,E[tot].y=p;
        num+=(ts[p1]-'0')*Pow[p1],num-=(ts[p2]-'0')*Pow[p1];
        num+=(ts[p2]-'0')*Pow[p2],num-=(ts[p1]-'0')*Pow[p2];
      }
    }
  }
  sort(E+1,E+1+tot,_cmp);
  tot=unique(E+1,E+1+tot)-E-1;
  FOR(i,1,tot) 
  {
    int a=E[i].x,b=E[i].y;
    int Len=0;
    FOR(j,0,9) if (s[a][j]==s[b][j]) Len++;else break;
    add(a,b,cost[Len]);
  }
  SPFA(ss);
  if (dis[tt]==inf) printf("-1\n");else printf("%d\n",dis[tt]);
  return 0;
}