#include <stdio.h>
#include <memory.h>
#define NMAX 505
#define PMAX 55
#define INFI 0x3f3f3f3f
int c[NMAX][NMAX];
int minim[PMAX][PMAX][PMAX];
int p, n, m;
int dist[PMAX][PMAX];
int dest[PMAX];
void read()
{
memset(c, INFI, sizeof(c));
int i;
int x, y, z;
scanf("%d%d%d", &p, &n, &m);
for(i = 1; i <= m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
c[x][y] = c[y][x] = z;
}
for(i = 1; i <= p; ++i)
scanf("%d", dest+i);
}
int dj[PMAX], uz[PMAX];
void djikstra(int s)
{
int i, j, minim, poz;
memset(uz, 0, sizeof(uz));
memset(dj, INFI, sizeof(dj));
//++uz[s];
dj[s] = 0;
for(i = 1; i <= n; ++i)
{
for(minim = INFI, j = 1; j <= n; ++j)
if(!uz[j] && minim > dj[j])
minim = dj[j], poz = j;
if(minim == INFI)
return ;
for(++uz[poz], j = 1; j <= n; ++j)
if(!uz[j] && minim + c[poz][j] < dj[j])
dj[j] = minim + c[poz][j];
}
}
void cdist()
{
int i, j;
dest[0] = 1;
for(i = 0; i <= p; ++i)
{
djikstra(dest[i]);
for(j = 0; j <= p; ++j)
{
dist[i][j] = dj[ dest[j] ];
//printf("%d ", dist[i][j]);
}
//printf("\n");
}
}
#define MIN(a, b) ((a) < (b)) ? (a) : (b)
int f(int j,int x,int y){
if (x>y) return 0;
if (minim[j][x][y]>=0) return minim[j][x][y];
if (x==y&&j==x) return 0;
minim[j][x][y]=1000000000;
for (int k=x;k<=y;k++)
minim[j][x][y]=MIN(minim[j][x][y],dist[j][k]+f(k,x,k-1)+f(k,k+1,y));
return minim[j][x][y];
}
int main()
{
freopen("team.in", "r", stdin);
freopen("team.out", "w", stdout);
read();
cdist();
//memset(minim, -INFI, sizeof(minim));
memset(minim,255,sizeof(minim));
//for(int i = 0; i <= p; ++i)
//minim[i][i][i] = 0;
printf("%d\n", f(0, 1, n));
return 0;
}