#include <stdio.h>
#define MAX_P 64
#define MAX_N 512
#define FIN "team.in"
#define FOUT "team.out"
#define INF 1000000666
#define FOR(i, a, b) for (i = (a); i < (b); i++)
int N, M, P, G[MAX_N][MAX_N], C[MAX_P][MAX_N], D[MAX_P];
int bst[MAX_P][MAX_P][MAX_N];
void dijkstra(int src, int dist[])
{
int i, min, pos;
char U[MAX_N];
FOR (i, 0, N) { dist[i] = INF; U[i] = 0; }
dist[src] = 0;
while (1)
{
min = INF; pos = -1;
FOR (i, 0, N) if (!U[i] && min > dist[i])
min = dist[i], pos = i;
if (pos == -1) break;
U[pos] = 1;
FOR (i, 0, N) if (dist[i] > dist[pos]+G[pos][i])
dist[i] = dist[pos]+G[pos][i];
}
}
int solve(int l, int r, int s)
{
int m, t, &ret = bst[l][r][s];
if (l > r) return 0;
if (l == r) return C[l][s];
if (ret != -1) return ret;
ret = INF;
FOR (m, l, r+1)
{
t = C[m][s] + solve(l, m-1, D[m]) + solve(m+1, r, D[m]);
if (ret > t) ret = t;
}
return ret;
}
int main(void)
{
int i, j, k, c;
freopen(FIN,"r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d %d", &P, &N, &M);
FOR (i, 0, N) FOR (j, 0, N) G[i][j] = (i != j)*INF;
for (; M > 0; M--)
{
scanf("%d %d %d", &i, &j, &c);
i--; j--;
G[i][j] = G[j][i] = c;
}
FOR (i, 0, P)
{
scanf("%d", D+i); D[i]--;
dijkstra(D[i], C[i]);
}
FOR (i, 0, P) FOR (j, i, P) FOR (k, 0, N) bst[i][j][k] = -1;
printf("%d\n", solve(0, P-1, 0));
return 0;
}