#include <bits/stdc++.h>
#define ÄÄR 9999
using namespace std;
int N, alk, matkat[6][6];
int** vaihtoehdot;
vector<int> satamat;
vector<int> split(const string& str, char delimiter) {
vector<int> tokens;
string token;
istringstream tokenStream(str);
while (getline(tokenStream, token, delimiter)) {
tokens.push_back(stoi(token));
}
return tokens;
}
int lähin(int etä[], bool käyty[]) {
int k = 0;
int min = INT_MAX;
for (int i = 0; i < N; i++) {
if (!käyty[i] && etä[i] < min) {
min = etä[i];
k = i;
}
}
return k;
}
void init() {
for (int k = 0; k < N; k++) {
for (int j = 0; j < N; j++) {
if (k == j) {
matkat[k][j] = 0;
}
else if (matkat[k][j] == 0) {
matkat[k][j] = ÄÄR;
}
}
}
int rivit = N, pylväät = satamat.size();
vaihtoehdot = new int* [rivit];
if (rivit)
{
vaihtoehdot[0] = new int[rivit * pylväät];
for (int i = 1; i < rivit; ++i)
vaihtoehdot[i] = vaihtoehdot[0] + i * pylväät;
}
}
void laskenta(int pylväs, int alk) {
int par[100], etä[100];
bool käyty[100] = { 0 };
fill(etä, etä + N, INT_MAX);
alk = satamat[pylväs];
etä[alk] = 0;
par[alk] = -1;
for (int g = 0; g < N - 1; g++) {
int u = lähin(etä, käyty);
käyty[u] = true;
for (int v = 0; v < N; v++) {
if (alk == v) {
etä[v] = 0;
vaihtoehdot[v][pylväs] = etä[v];
}
if (!käyty[v] && (etä[u] + matkat[u][v]) < etä[v] && matkat[u][v] != 9999)
{
par[v] = u;
etä[v] = etä[u] + matkat[u][v];
vaihtoehdot[v][pylväs] = etä[v];
}
}
}
}
void näytä() {
cout << "Satamat ovat ";
for (int l = 0; l < satamat.size(); l++) {
cout << satamat[l] + 1 << " ";
}
cout << endl;
cout << "Kaupunki:" << "\t\t\t";
for (int y = 0; y < satamat.size(); y++) {
cout << "Satama" << y << ":" << "\t\t\t";
}
cout << endl;
for (int t = 0; t < N; t++) {
cout << t << "\t\t\t";
for (int u = 0; u < satamat.size(); u++) {
cout << vaihtoehdot[t][u] << "\t\t\t";
}
cout << endl;
}
}
int main() {
cin >> N;
string inputString;
cin.ignore();
getline(cin, inputString);
stringstream stream(inputString);
std::vector<int> välisatamat;
int n;
while (stream >> n) {
välisatamat.push_back(n);
}
for (int z = 0; z < välisatamat.size(); z++) {
if (välisatamat[z] == 0) {
satamat.push_back(z);
}
}
int satamaMäärä = satamat.size();
int rivimäärä = N;
int laskuri = 0;
for (int i = 0; i < rivimäärä - 1; i++) {
string line;
getline(cin, line);
vector<int> rivi = split(line, ' ');
istringstream iss(line);
int num;
iss >> num;
rivi.push_back(num);
matkat[rivi[0] - 1][rivi[1] - 1] = rivi[2];
matkat[rivi[1] - 1][rivi[0] - 1] = rivi[2];
}
init();
for (int g = 0; g < satamat.size(); g++) {
laskenta(g, satamat[g]);
}
int laskin = 0;
for (int j = 0; j < N; j++) {
int pienin = ÄÄR;
for (int i = 0; i < satamat.size(); i++) {
if (*vaihtoehdot[j, i] < pienin) {
pienin = *vaihtoehdot[j, i];
}
}
laskin += pienin;
}
cout << laskin;
}