#include <bits/stdc++.h>
#define INF (1<<30)
#define maxN 505
#define maxP 52
#define pii pair<int,int>
using namespace std;
vector<pair<int,int> >v[maxN];
int dist[maxN][maxN];
int dp[maxP][maxP][maxN];
int n,m,p,i,j,k,x,y,z,loc[maxN];
priority_queue<pii,vector<pii>,greater<pii> >Heap;
void dijkstra(int start)
{
int i;
for(i=1;i<=n;i++)
dist[start][i]=INF;
dist[start][start]=0;
Heap.push(make_pair(0,start));
while(!Heap.empty())
{
int nod=Heap.top().second;
Heap.pop();
for(vector<pii>::iterator it=v[nod].begin();it!=v[nod].end();it++)
if(dist[start][it->first]>dist[start][nod]+it->second)
dist[start][it->first]=dist[start][nod]+it->second,
Heap.push(make_pair(dist[start][it->first],it->first));
}
}
int memo(int st,int dr,int nod)
{
if(st>dr)
return 0;
if(dp[st][dr][nod]!=INF)
return dp[st][dr][nod];
for(int i=st;i<=dr;i++)
dp[st][dr][nod]=min(dp[st][dr][nod],memo(st,i-1,loc[i])+memo(i+1,dr,loc[i])+dist[loc[i]][nod]);
return dp[st][dr][nod];
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d %d %d",&p,&n,&m);
for(i=1;i<=p;i++)
for(j=1;j<=p;j++)
for(k=1;k<=n;k++)
dp[i][j][k]=INF;
for(i=1;i<=m;i++)
scanf("%d %d %d",&x,&y,&z),
v[x].push_back(make_pair(y,z)),
v[y].push_back(make_pair(x,z));
for(i=1;i<=p;i++)
scanf("%d",&loc[i]),
dijkstra(loc[i]),
dp[i][i][loc[i]]=0;
printf("%d",memo(1,p,1));
return 0;
}