#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int inf=2000000000,maxx1=17,maxx2=2002,maxx3=1<<15;
int n,m,k,i,j,mult,A,B,C,K[maxx1],a[maxx1][maxx3],dist[maxx1][maxx2],minim=inf,poz,poz2,dista,tata[maxx2],sol[maxx2];
vector < pair<int,int> > x[maxx2];
vector <int> curent;
bool viz[maxx2];
void read()
{
scanf("%d %d\n%d",&n,&m,&k);
for(i=1;i<=k;i++)
scanf("%d ",&K[i]);
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&A,&B,&C);
x[A].push_back(make_pair(B,C));
x[B].push_back(make_pair(A,C));
}
}
int exist(int bit,int nr)
{
if(nr & (1<<bit))
return 1;
return 0;
}
int distanceee(int i,int j)
{
for(int k=0;k<x[i].size();k++)
if(x[i][k].first==j)
return x[i][k].second;
}
void dijkstra(int start,int sol[maxx2])
{
int i;
for(i=0;i<x[start].size();i++)
sol[x[start][i].first]=x[start][i].second;
for(i=1;i<=n;i++)
{
if(i!=start)
{
viz[i]=false;
if(sol[i]==0)
sol[i]=inf;
curent.push_back(i);
}
}
for(int k=1;k<n;k++)
{
minim=inf;
for(i=0;i<curent.size();i++)
if(minim>sol[curent[i]]&&viz[curent[i]]==false)
{
minim=sol[curent[i]];
poz=curent[i];
poz2=i;
}
viz[poz]=true;
for(i=0;i<curent.size();i++)
{
dista=distanceee(poz,curent[i]);
if(viz[curent[i]]==false&&dista!=0)
{
if(sol[curent[i]]>sol[poz]+dista)
{
sol[curent[i]]=sol[poz]+dista;
tata[curent[i]]=poz;
}
}
}
curent.erase (curent.begin()+poz2);
}
}
int main()
{
freopen("ubuntzei.in","r",stdin);
freopen("ubuntzei.out","w",stdout);
read();
if(k==0)
{
dijkstra(1,sol);
printf("%d\n",sol[n]);
}
else
{
for(i=1;i<=k;i++)
dijkstra(K[i],dist[i]);
for(mult=1;mult<(1<<k);mult++)
{
for(i=0;i<=k-1;i++)
if(mult==(1<<i))
{
a[i+1][mult]=dist[i+1][1];
i=k+4;
}
if(i==k)
{
for(i=1;i<=k;i++)
{
a[i][mult]=inf;
if(exist(i-1,mult))
for(j=1;j<=k;j++)
if(i!=j&&exist(j-1,mult))
a[i][mult]=min(a[i][mult],a[j][mult-(1<<(i-1))]+dist[j][K[i]]);
}
}
}
int col=(1<<k)-1;
minim=inf;
for(i=1;i<=k;i++)
minim=min(minim,a[i][col]+dist[i][n]);
printf("%d\n",minim);
}
return 0;
}