#include<fstream>
#define inf 0x3f3f3f
#include<cstring>
#define NM 510
#define PM 55
#define FOR(a,b,c) for(int a=b;a<=c;++a)
#define ROF(a,b,c) for(int a=b;a>=c;--a)
using namespace std;
ifstream f("team.in");
ofstream g("team.out");
int dp[PM][PM][PM],P[PM][PM],C[NM][NM],X[NM],viz[NM],n,x,y,p,m,D[PM],c;
void dijkstra(int x)
{
memset(X,inf,sizeof(X));
memset(viz,0,sizeof(viz));
X[x]=0;
FOR(i,1,n)
{
int bj=0;
FOR(j,1,n)
if(!viz[j]&&X[j]<X[bj]) bj=j;
FOR(j,1,n)
if(X[bj]+C[bj][j]<X[j]) X[j]=X[bj]+C[bj][j];
viz[bj]=1;
}
}
int find(int dest,int fr,int sc)
{
if(fr>sc)
return 0;
if(dp[dest][fr][sc]>=0)
return dp[dest][fr][sc];
if(dest==fr&&sc==fr)
return 0;
dp[dest][fr][sc]=inf;
FOR(j,fr,sc)
dp[dest][fr][sc]=min(dp[dest][fr][sc],find(j,j+1,sc)+P[dest][j]+find(j,fr,j-1));
return dp[dest][fr][sc];
}
int main ()
{
f>>p>>n>>m;
memset(C,inf,sizeof(C));
FOR(i,1,m)
{
f>>x>>y>>c;
C[x][y]=C[y][x]=c;
}
FOR(i,1,p)
f>>D[i];
D[0]=1;
FOR(i,0,p)
{
dijkstra(D[i]);
FOR(j,0,p)
P[i][j]=X[D[j]];
}
memset(dp,-1,sizeof(dp));
g<<find(0,1,p);
return 0;
}