#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;
}