#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define mt make_tuple
#define ll long long
#define pii pair<int,int>
#define tii tuple <int,int,int>
#define N 2005
#define oo 1000000005
#define X first
#define Y second
#define eps 0.0000000001
#define all(x) x.begin(),x.end()
#define tot(x) x+1,x+n+1
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n, m, i, x, z, y, nn, k, j, nod, vec, cost;
priority_queue<pair<int, pii>, vector<pair<int, pii>>, greater<pair<int, pii> >> q;
ll val, val1;
unordered_map<int, int>r;
int B, b, bb, bc, BB;
vector < tii> v[2016];
unordered_map<ll, int > d, inq;
vector<int>vb;
int main() {
fin >> n >> m >> k;
for(i = 1; i <= k; i++) {
fin >> x;
r[x] = i ;
B |= (1 << r[x]);
BB |= (1 << (r[x] - 1));
}
for(; m; m--) {
fin >> x >> y >> z;
b = 0;
if(B & (1 << r[x]))
b = (1 << (r[x] - 1));
v[x].pb(mt(y, z, b));
b = 0;
if(B & (1 << r[y]))
b = (1 << (r[y] - 1));
v[y].pb(mt(x, z, b));
}
nn = (1 << k);
for(i = 0; i < nn; i++) {
vb.pb(i);
}
for(i = 1; i <= n; i++)
for(j = 0; j < nn; j++) {
val = i * 100000ll + vb[j];
d[val] = oo;
}
b = 0;
d[100000] = 0;
q.push(mp(0, mp(1, b)));
while(q.size()) {
nod = q.top().Y.X;
b = q.top().Y.Y;
q.pop();
// inq[mp(nod, b)] = 0;
for(auto it : v[nod]) {
tie(vec, cost, bb) = it;
bc = 0;
bc = (bb | b);
val = nod * 100000ll + b;
val1 = vec * 100000ll + bc;
if(d[val] + cost < d[val1]) {
d[val1] = d[val] + cost ;
// if(!inq[mp(vec, bc)]) {
//inq[mp(vec, bc)] = 1;
q.push(mp(d[val1], mp(vec, bc)));
// }
}
}
}
val = n * 100000ll + BB;
fout << d[val];
return 0;
}