
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#define ll long long
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const int mod=1e9+7;
const int maxn=110;
const int maxx=1100;
int head[maxn],ver[maxx],edge[maxx],nt[maxx];
int dp[maxn][maxx],p[maxn],tot=1;
bool ha[maxn];
priority_queue<pair<int,int> >q;
void add(int x,int y,int z)
{
ver[++tot]=y,edge[tot]=z;
nt[tot]=head[x],head[x]=tot;
}
void dij(int s)
{
memset(ha,0,sizeof(ha));
while(q.size())
{
int x=q.top().second;
q.pop();
if(ha[x]) continue;
ha[x]=true;
for(int i=head[x];i;i=nt[i])
{
int y=ver[i],z=edge[i];
if(dp[y][s]>dp[x][s]+z)
{
dp[y][s]=dp[x][s]+z;
q.push(pr(-dp[y][s],y));
}
}
}
}
int main(void)
{
int n,m,k;
int x,y,z;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
memset(dp,0x3f,sizeof(dp));
for(int i=1;i<=k;i++)
{
scanf("%d",&p[i]);
dp[p[i]][1<<(i-1)]=0;
}
for(int s=1;s<(1<<k);s++)
{
for(int i=1;i<=n;i++)
{
for(int subs=(s-1)&s;subs;subs=(subs-1)&s)
{
dp[i][s]=min(dp[i][s],dp[i][subs]+dp[i][s^subs]);
}
if(dp[i][s]!=inf) q.push(pr(-dp[i][s],i));
}
dij(s);
}
printf("%d\n",dp[p[1]][(1<<k)-1]);
return 0;
}