#include <cstdio>
#include <cstring>
#include <vector>
#define maxn 510
#define maxp 55
#define inf 1000000000
using namespace std;
int n, m, p, i, j, k, a, b, c, i1, i2, rez;
vector <int> v[maxn], cs[maxn];
int d[maxn][maxp][maxp];
bool viz[maxn][maxp][maxp];
int dmin[maxn][maxn], t[maxp], muc[maxn][maxn];
int baga(int nod, int left, int right) {
int i, j, ok = 0, fiu, cost, i1, i2, fin = inf;
if (viz[nod][left][right])
return d[nod][left][right];
viz[nod][left][right] = 1;
if (left == right) {
d[nod][left][right] = dmin[nod][t[left]];
// printf("%d %d %d %d\n", nod, left, right, d[nod][left][right]);
return d[nod][left][right];
}
if (ok) {
d[nod][left][right] = 0;
return 0;
}
// printf("%d %d %d\n", nod, left, right);
for (i = 0; i < v[nod].size(); i++) {
fiu = v[nod][i];
cost = cs[nod][i];
i1 = left; i2 = left;
for (j = left; j <= right; j++) {
// printf("%d %d\n", j, t[j]);
if (t[j - 1] == fiu)
i1 = j;
if (t[j] == fiu) {
i2 = j - 1;
if (i2 >= i1) {
// printf("%d %d %d\n", fiu, i1, i2);
cost += baga(fiu, i1, i2);
}
}
}
if (t[right] != fiu) {
// printf("%d %d %d\n", fiu, i1, right);
cost += baga(fiu, i1, right);
}
if (cost < fin)
fin = cost;
//tre sa merg sa vad cum sparg intervalu curent
}
// printf("%d %d %d %d\n", nod, left, right, fin);
d[nod][left][right] = fin;
return fin;
}
int main() {
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d%d%d", &p, &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d%d%d", &a, &b, &c);
muc[a][b] = muc[b][a] = 1;
v[a].push_back(b);
cs[a].push_back(c);
v[b].push_back(a);
cs[b].push_back(c);
}
for (i = 1; i <= p; i++)
scanf("%d", &t[i]);
for (i = 0; i < maxn; i++)
for (j = 0; j < maxp; j++)
for (k = 0; k < maxp; k++)
d[i][j][k] = inf;
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++)
dmin[i][j] = inf;
for (i = 1; i <= n; i++)
for (j = 0; j < v[i].size(); j++) {
dmin[i][v[i][j]] = cs[i][j];
dmin[v[i][j]][i] = cs[i][j];
}
for (i = 1; i <= n; i++)
dmin[i][i] = 0;
for (k = 1; k <= n; k++)
for (i = 1; i <= n; i++)
// if (muc[i][k])
for (j = 1; j <= n; j++)
if (dmin[i][k] + dmin[k][j] < dmin[i][j])
dmin[i][j] = dmin[i][k] + dmin[k][j];
i1 = 1; i2 = 1;
for (j = 1; j <= p; j++) {
if (t[j - 1] == 1)
i1 = j;
if (t[j] == 1) {
i2 = j - 1;
if (i1 <= i2)
rez += baga(1, i1, i2);
}
}
if (t[p] != 1)
rez += baga(1, i1, p);
printf("%d\n", rez);
// printf("%d\n", dmin[6][7]);
//sparg intervalu pe bucati la inceputu functiei si iau minimu pentru fiecare bucata
return 0;
}