#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
const int nmax=505;
const int pmax=55;
struct pq_member
{
int node,co;
}el;
struct comp
{
bool operator()(pq_member unu,pq_member doi)
{
return unu.co>doi.co;
}
};
priority_queue<pq_member,vector<pq_member>,comp> pq;
vector< pair<int,int> > v[nmax];
int best[pmax][pmax][pmax],cost[pmax][pmax];
int dist[nmax],casa[pmax];
int n,m,i,j,k,ind,start,costul,p,a,b,c,cnt;
void dijkstra(int nodstart)
{
for(i=1;i<=n;i++)
dist[i]=(1<<30);
dist[nodstart]=0;
el.node=nodstart;el.co=0;
pq.push(el);
while(!pq.empty())
{
start=pq.top().node;
costul=pq.top().co;
pq.pop();
for(i=0;i<v[start].size();i++)
{
el.node=v[start][i].first;
el.co=costul+v[start][i].second;
if(el.co<dist[el.node])
{
dist[el.node]=el.co;
pq.push(el);
}
}
}
}
int main()
{
ifstream f("team.in");
ofstream g("team.out");
f>>p>>n>>m;
for(i=1;i<=m;i++)
{
f>>a>>b>>c;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
for(i=1;i<=p;i++)
{
f>>casa[i];
}
for(cnt=1;cnt<=p;cnt++)
{
dijkstra(casa[cnt]);
for(i=1;i<=p;i++)
cost[cnt][i]=dist[casa[i]];
cost[cnt][p+1]=dist[1];
cost[p+1][cnt]=dist[1];
}
for(i=1;i<=p;i++)
for(j=1;j<=p;j++)
for(k=1;k<=p+1;k++)
best[i][j][k]=(1<<30)-1;
for(i=1;i<=p;i++)
best[1][i][i]=0;
for(i=1;i<=p;i++)
for(j=1;j<=p-i+1;j++)
for(k=1;k<=p+1;k++)
{
if(k>=j&&k<=i+j-1)
{
if(best[k-j][j][k]+best[i-(k-j)-1][k+1][k]<best[i][j][k])
best[i][j][k]=best[k-j][j][k]+best[i-(k-j)-1][k+1][k];
}
if(best[i][j][k]<(1<<30)-1)
for(ind=1;ind<=p+1;ind++)
if(best[i][j][k]+cost[k][ind]<best[i][j][ind])
best[i][j][ind]=best[i][j][k]+cost[k][ind];
}
g<<best[p][1][p+1];
return 0;
}