#include <cstdio>
#include <vector>
#include <queue>
#include <bitset>
#include <algorithm>
#include <climits>
FILE *f=fopen("ubuntzei.in","r");
FILE *g=fopen("ubuntzei.out","w");
#define pb push_back
#define mp make_pair
#define v first
#define cost second
using namespace std;
const int Nmax=2005,Mmax=10005,INF=INT_MAX/2;
int N,M,K,nodes[16],D[Nmax][Nmax],way[16];
char used[Nmax][Nmax];
vector<pair<int,int> > lv[Nmax];
vector<pair<int,int> > ::iterator it;
struct cmp{
bool operator()(const pair<int,int> A, const pair<int,int> B)const
{
return A.second > B.second;
}
};
priority_queue<pair<int,int> , vector<pair<int,int> >,cmp> Q;
void get_graph()
{
fscanf(f,"%d%d%d",&N,&M,&K);
for(int i=1;i<=K;++i)fscanf(f,"%d", &way[i]);
int a,b,c;
for(int i=1;i<=M;++i)
{
fscanf(f,"%d%d%d",&a,&b,&c);
lv[a].pb(mp(b,c));
lv[b].pb(mp(a,c));
}
}
void dijkstra(int k)
{
Q.push(mp(k,0));
for(int i=1;i<=N;++i)
D[k][i]=INF;
D[k][k]=0;
int nodc,cst;
while(!Q.empty())
{
nodc=Q.top().v;
Q.pop();
used[k][nodc]=1;
for(it=lv[nodc].begin();it!=lv[nodc].end();++it)
if(!used[k][it->v] && D[k][it->v] > D[k][nodc] + it->cost)
{
D[k][it->v]= D[k][nodc]+it->cost;
Q.push(mp(it->v,D[k][it->v]));
}
}
}
void solve()
{
if(K==0){fprintf(g,"%d",D[1][N]);return;}
sort(way+1,way+K+1);
int answer=INF,mini=0;
do
{
mini=D[1][way[1]];
for(int i=2;i<=K;++i)
mini+=D[way[i-1]][way[i]];
mini+=D[way[K]][N];
if(mini<answer)answer=mini;
}while(next_permutation(way+1,way+min(K+1,12)));
fprintf(g,"%d",answer);
}
int main()
{
get_graph();
for(int i=1;i<=N;++i)dijkstra(i);
solve();
return 0;
}