WA
#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include<string>
#include <cstdio>
#include <cmath>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
struct
{
int cost;
string str;
}S[100005];
int dp[100005];
int main()
{
int n;
loop:while (~scanf("%d", &n))
{
int i, j, k;
for (i = 1; i <= n; i++)
{
cin >> S[i].cost;
}
for (i = 1; i <= n; i++)
{
cin >> S[i].str;
}
dp[1] = 0;
for (i = 2; i <= n; i++)
{
string temp, temp1,temp2;
temp1 = S[i].str;
temp2 = S[i - 1].str;
reverse(temp1.begin(), temp1.end());
reverse(temp2.begin(), temp2.end());
temp=S[i - 1].str;
if (S[i].str>=S[i - 1].str)
{
dp[i] = dp[i - 1];
}
else if (temp1>= S[i - 1].str || temp2 <= S[i].str)
{
int s1, s2;
s1 = s2 = INF;
if (temp1 >= S[i - 1].str)
{
s1 = S[i].cost;
}
if (temp2 <= S[i].str)
{
s2 = S[i - 1].cost;
}
dp[i] = min(s1, s2);
if (dp[i] == s1)
{
dp[i - 1] = s2;
}
}
else
{
printf("-1\n");
goto loop;
}
}
cout << dp[n] << endl;
}
}