#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LONG_INF 10000000000000000 #define MAX_MOD 1000000007 #define REP(i,n) for(long long i = 0;i < n;++i) vector> vertexs[2000]; long long stay[2000] = {}; long long distances[100][100] = {}; int main() { int n; cin >> n; REP(i, n) { cin >> stay[i]; } int m; cin >> m; REP(i, m) { int a, b, c; cin >> a >> b >> c; vertexs[a].push_back(make_pair(b, c)); vertexs[b].push_back(make_pair(a, c)); } REP(i, 100) { REP(q, 100) { distances[i][q] = 100000000; } } for (int i = 0;i < n;++i) { priority_queue, vector>, greater>> now; now.push(make_pair(0, i)); distances[i][i] = 0; while (now.empty() == false) { pair wow = now.top(); now.pop(); if (distances[i][wow.second] == wow.first) { for (int q = 0;q < vertexs[wow.second].size();++q) { if (distances[i][vertexs[wow.second][q].first] > wow.first + vertexs[wow.second][q].second) { distances[i][vertexs[wow.second][q].first] = wow.first + vertexs[wow.second][q].second; now.push(make_pair(wow.first + vertexs[wow.second][q].second, vertexs[wow.second][q].first)); } } } } } long long ans = 100000000; for (int i = 1;i < n-1;++i) { for (int q = 1;q < n - 1;++q) { if (i != q) { ans = min(ans, distances[0][i] + distances[i][q] + distances[q][n - 1] + stay[i] + stay[q]); } } } cout << ans << endl; return 0; }