#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;
}