#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#define NMax 2001
#define Inf 1<<30
using namespace std;
long n, m, k, x, y, z, now, nr, minNr, maxK;
long a[21], cost[21][NMax], pw2[21], mp[16][(1<<15) + 10];
vector<pair<long, long> > edge[NMax];
void computeMinimalRoadFrom ( long ind, long now ) {
set<pair<long, long> > q;
for ( long i = 1; i <= n; i++ )
cost[ind][i] = Inf;
q.insert ( make_pair ( 0, now ) );
cost[ind][now] = 0;
while ( !q.empty ( ) ) {
now = q.begin ( )->second;
q.erase ( q.begin ( ) );
for ( long i = 0; i < edge[now].size ( ); i++ )
if ( cost[ind][now] + edge[now][i].second < cost[ind][edge[now][i].first] )
cost[ind][edge[now][i].first] = cost[ind][now] + edge[now][i].second,
q.insert ( make_pair ( cost[ind][edge[now][i].first], edge[now][i].first ) );
}
}
long optimal ( long last, long sequence );
int main()
{
freopen ( "ubuntzei.in", "r", stdin );
freopen ( "ubuntzei.out", "w", stdout );
scanf ( "%ld %ld %ld", &n, &m, &k );
maxK = (1 << k) - 1; pw2[0] = 1;
for ( long i = 1; i <= k; i++ ) {
pw2[i] = pw2[i - 1] * 2;
scanf ( "%ld", &a[i] );
}
for ( long i = 1; i <= m; i++ )
scanf ( "%ld %ld %ld", &x, &y, &z ),
edge[x].push_back ( make_pair ( y, z ) ),
edge[y].push_back ( make_pair ( x, z ) );
a[0] = 1;a[k + 1] = n;
for ( long i = 0; i <= k + 1; i++ )
computeMinimalRoadFrom ( i, a[i] );
minNr = Inf;
if ( k == 0 )
minNr = cost[0][n];
else {
for ( long i = 1; i <= k; i++ )
for ( long j = 1; j <= 1<<k; j++ )
mp[i][j] = Inf;
for ( long i = 1; i <= k; i++ )
minNr = min ( minNr, optimal ( i, maxK ) + cost[i][n] );
}
printf ( "%ld\n", minNr );
return 0;
}
long optimal ( long last, long sequence ) {
if ( pw2[k - last] == sequence )
return cost[0][a[last]];
if ( mp[last][sequence] < Inf )
return mp[last][sequence];
long sq = sequence - pw2[k - last];
for ( long i = 0, st = sq, pw = 1; i < k; i++, st = st >> 1 )
if ( st & 1 )
mp[last][sequence] = min ( mp[last][sequence], optimal( k - i, sq ) + cost[k - i][a[last]] );
return mp[last][sequence];
}