#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<queue>
using namespace std;
int ans = 0x3f3f3f3f;
int n, k, x, y;
int G[21][21];
int num[21];
bool vis[21];
void dfs(int i, int cnt);
int main() {
memset(num, 0, sizeof(num));
for (int i = 1; i <= 20; i++) {
for (int j = 1; j <= 20; j++) {
G[i][j] = -1;
}
}
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> G[i][(i % n) + 1];
G[(i % n) + 1][i] = G[i][(i % n) + 1];
}
for (int i = 1; i <= k; i++) {
char st, ed;
int val;
cin >> st >> ed >> val;
if (st != ed) {
G[st - 'A' + 1][ed - 'A' + 1] = max(G[st - 'A' + 1][ed - 'A' + 1], val);
G[ed - 'A' + 1][st - 'A' + 1] = max(G[ed - 'A' + 1][st - 'A' + 1], val);
}
else {
num[st - 'A' + 1] = max(num[st - 'A' + 1], val);
}
}
char st, ed;
cin >> st >> ed;
x = st - 'A' + 1, y = ed - 'A' + 1;
dfs(x, num[x]);
cout << ans;
return 0;
}
void dfs(int i, int cnt) {
if (cnt > ans) {
return;
}
if (i == y) {
ans = cnt;
return;
}
for (int j = 1; j <= n; j++) {
if (i == j)continue;
if (G[i][j] != -1 && !vis[j]) {
vis[j] = 1;
dfs(j, cnt + num[j] + G[i][j]);
vis[j] = 0;
}
}
}