#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <algorithm>
#define nmax 2001
#define kmax 16
#define inf 1<<30
using namespace std;
FILE *f=fopen("ubuntzei.in","r"),*g=fopen("ubuntzei.out","w");
struct muc{
int c,d;
};
int best[1<<kmax][kmax],n,v[kmax+1],a[nmax][nmax],nod,k;
struct comp{
int operator()(int x, int y)
{
return a[nod][x]>a[nod][y];
}
};
vector <muc> l[nmax];
priority_queue <int, vector <int>, comp> q;
void dij()
{
int i,j,x;
q.push(nod);
for(i=1;i<=n;i++)
a[nod][i]=inf;
a[nod][nod]=0;
while(!q.empty())
{
x=q.top();
q.pop();
for(i=0;i<l[x].size();i++)
{
j=l[x][i].d;
if(a[nod][j]>a[nod][x]+l[x][i].c)
{
a[nod][j]=a[nod][x]+l[x][i].c;
q.push(j);
}
}
}
}
int drum(int conf, int x)
{
if(best[conf][x]!=0)
return best[conf][x];
if(conf==0)
return 0;
int i,j,p,val=inf,y;
for(i=0;i<=k;i++)
{
if(i>0)
{
if(conf&1<<i)
val=min(val,drum(conf xor 1<<i,i)+a[v[x]][v[i]]);
}
else if(i==0&&conf==1)
val=a[v[x]][v[i]];
}
best[conf][x]=val;
return best[conf][x];
}
int main()
{
int i,j,m,x,y,mini=inf; muc aux;
fscanf(f,"%d %d",&n,&m);
fscanf(f,"%d",&k);
for(i=1;i<=k;i++)
fscanf(f,"%d",&v[i]);
for(i=1;i<=m;i++)
{
fscanf(f,"%d %d %d",&x,&y,&aux.c);
aux.d=y;
l[x].push_back(aux);
aux.d=x;
l[y].push_back(aux);
}
nod=1; dij();
if(k==0)
{
fprintf(g,"%d",a[1][n]);
fclose(f);
fclose(g);
return 0;
}
for(i=1;i<=k;i++)
{
nod=v[i];
dij();
}
v[0]=n;
for(i=1;i<=k;i++)
{
x=drum((1<<(k+1))-1 xor 1<<i,i)+a[1][v[i]];
if(x<mini)
mini=x;
}
fprintf(g,"%d",mini);
fclose(f);
fclose(g);
return 0;
}