#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define NMAX 510
#define INF 1000000010
int P, N, M;
int dist[NMAX][NMAX];
int d[NMAX];
int din[55][55][55];
char viz[55][55][55];
int dd[NMAX];
int coada[NMAX * NMAX];
char in_coada[NMAX];
int ddist[55][55];
void get_dist(int x)
{
int p = 0, q = 0, i, c;
coada[0] = x;
memset(in_coada, 0, sizeof(in_coada));
for (i = 1; i <= N; i++) dd[i] = INF;
dd[x] = 0;
in_coada[x] = 1;
while (p <= q) {
x = coada[p++];
in_coada[x] = 0;
for (i = 1; i <= N; i++)
if ((c = dd[x] + dist[x][i]) < dd[i]) {
dd[i] = c;
if (!in_coada[i]) {
coada[++q] = i;
in_coada[i] = 1;
}
}
}
}
int calc(int x, int y, int k)
{
if (x > y) return 0;
if (viz[x][y][k]) return din[x][y][k];
viz[x][y][k] = 1;
int rez = INF;
for (int i = x; i <= y; i++)
rez = min(rez, calc(x, i - 1, i) + calc(i + 1, y, i) + ddist[k][i]);
return din[x][y][k] = rez;
}
int beg;
char s[110];
inline void GET(int &x)
{
for (; s[beg] && !('0' <= s[beg] && s[beg] <= '9'); beg++);
for (x = 0; '0' <= s[beg] && s[beg] <= '9'; beg++)
x = x * 10 + s[beg] - '0';
}
int gen(int P, int N, int M)
{
freopen("team.in", "w", stdout);
printf("%d %d %d\n", P, N, M);
int i;
for (i = 1; i <= M; i++) {
printf("%d %d %d\n", rand() % N + 1, rand() % N + 1, rand() % 100 + 1);
}
for (i = 1; i <= P; i++) printf("%d ", rand() % N + 1);
printf("\n");
fclose(stdout);
return 0;
}
int main()
{
// gen(50, 500, 100000);
int i, j, x, y, c;
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
scanf("%d %d %d\n", &P, &N, &M);
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
if (i != j) dist[i][j] = INF;
for (i = 1; i <= M; i++) {
// scanf("%d %d %d", &x, &y, &c);
fgets(s, 110, stdin); beg = 0;
GET(x); GET(y); GET(c);
dist[x][y] = min(dist[x][y], c);
dist[y][x] = min(dist[y][x], c);
}
/* for (int k = 1; k <= N; k++)
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
*/
for (i = 1; i <= P; i++) scanf("%d", &d[i]);
d[0] = 1;
for (i = 0; i <= P; i++) {
get_dist(d[i]);
for (j = 0; j <= P; j++) ddist[i][j] = dd[ d[j] ];
}
int rez = INF;
for (i = 1; i <= P; i++)
rez = min(rez, calc(1, i-1, i) + calc(i + 1, P, i) + ddist[0][i]);
printf("%d\n", rez);
return 0;
}