//team-Lot, 2006
#include<bits/stdc++.h>
#define N 55
#define M 512
#define oo 2*1e9
using namespace std;
int n,m,p,X[M],dist[M];
bool viz[M];
vector < pair < int,int > > G[M];
typedef struct Lm{int nod,cost;};
typedef struct cmpdst
{
bool operator() (Lm x, Lm y)
{
return x.cost>y.cost;
}
};
priority_queue <Lm, vector<Lm>, cmpdst> q;
int cost[N][N][N],dest[M][M];
inline void dijkstra(int S)
{
int node,co,i;
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++) dist[i]=oo;
dist[S]=0;
Lm dg,k;
dg.nod=S;
dg.cost=0;
q.push(dg);
while(!q.empty())
{
node=q.top().nod;
q.pop();
if(!viz[node])
{
viz[node]=1;
for(i=0;i<G[node].size();i++)
{
dg.nod=G[node][i].first;
dg.cost=G[node][i].second;
if(dist[dg.nod]>dist[node]+dg.cost)
{
dist[dg.nod]=dist[node]+dg.cost;
k.nod=dg.nod;
k.cost=dist[dg.nod];
q.push(k);
}
}
}
}
}
void read()
{
freopen("team.in","r",stdin);
scanf("%d%d%d",&p,&n,&m);
int x,y,c,i,j;
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&c);
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
for(i=1;i<=p;i++) scanf("%d",&X[i]);
X[0]=1;
for(i=0;i<=p;i++)
{
dijkstra(X[i]);
for(j=0;j<=p;j++)
{dest[i][j]=dist[X[j]];
//cout<<dest[i][j]<<' ';
}
//cout<<endl;
}
}
int get_cost(int i, int j, int k)
{
if(i>j) return 0;
if(cost[i][j][k]>=0) return cost[i][j][k];
if(i==j && j==k) return 0;
cost[i][j][k]=oo;
for(int u=i;u<=j;u++)
cost[i][j][k]=min( cost[i][j][k], dest[k][u] +get_cost(i,u-1,u)+get_cost(u+1,j,u) );
return cost[i][j][k];
}
int main()
{
read();
memset(cost,255,sizeof(cost));
freopen("team.out","w",stdout);
cout<<get_cost(1,p,0);
}