#include<cstdio>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<cstring>
#define infile "ubuntzei.in"
#define outfile "ubuntzei.out"
#define n_max 2005
#define k_max 17
#define INF 0x3F3F3F3F
#define pb push_back
#define mkp make_pair
#define ls(i) i<<1
#define rs(i) (i<<1)+1
#define f(i) i>>1
using namespace std;
vector < pair<int, int> > v[n_max], vk[1<<k_max];
vector <int> subset, id_subset(n_max);
bitset <n_max> in_subset;
int dist[k_max][1<<k_max];
int n, k, start, finish;
void percolate(int, vector<int>&, vector<int>&, vector<int>& );
void citeste()
{
freopen(infile,"r",stdin);
int m, x, y, c;
scanf("%d %d",&n,&m);
scanf("%d",&k);
for(int i=0;i<k;i++)
{
scanf("%d",&x);
x--;
subset.pb(x);
id_subset[x] = i;
in_subset[x] = 1;
}
subset.pb(start = 0); id_subset[start] = subset.size()-1; in_subset[start] = 1;
subset.pb(finish = n-1); id_subset[finish] = subset.size()-1; in_subset[finish] = 1;
while(m--)
{
scanf("%d %d %d",&x,&y,&c);
x--, y--;
v[x].pb(mkp(y,c));
v[y].pb(mkp(x,c));
}
fclose(stdin);
}
void insert(int x, int &N, vector<int> &h, vector<int> &poz, vector<int> &d)
{
h[++N] = x;
poz[x] = N;
percolate(N, h, poz, d);
}
void sift(int k, int &N, vector<int> &h, vector<int> &poz, vector<int> &d)
{
int son = k, l = ls(k), r = rs(k);
if(l<=N && d[h[l]] < d[h[son]])
son = l;
if(r<=N && d[h[r]] < d[h[son]])
son = r;
if(son!=k)
{
swap(poz[h[son]], poz[h[k]]);
swap(h[son], h[k]);
sift(son, N, h, poz, d);
}
}
void percolate(int k, vector<int> &h, vector<int> &poz, vector<int> &d)
{
while(k>1 && d[h[k]] < d[h[f(k)]])
{
swap(poz[h[k]], poz[h[f(k)]]);
swap(h[k], h[f(k)] );
k = f(k);
}
}
int get_min_heap(int &N, vector<int> &h, vector<int> &poz, vector<int> &d )
{
int minim = h[1];
poz[minim] = 0;
h[1] = h[N--];
poz[h[1]] = 1;
sift(1, N, h, poz, d);
return minim;
}
vector <int> dijkstra(int start)
{
int N = 0;
vector <int> h(n_max), poz(n_max), d(n, INF);
vector< pair <int, int> > ::iterator it;
d[start] = 0;
insert(start, N, h, poz, d);
while(N)
{
int x = get_min_heap(N, h, poz, d);
for(it=v[x].begin(); it!=v[x].end(); ++it)
{
int y = (*it).first;
int cost = (*it).second;
if(d[x] + cost < d[y])
{
d[y] = d[x] + cost;
if(!poz[y])
insert(y, N, h, poz, d);
else
percolate(poz[y], h, poz, d);
}
}
}
return d;
}
int dijkstraK(int start, int finish, int nk)
{
priority_queue < pair <int, pair <int, int> > > h;
vector< pair <int, int> > ::iterator it;
memset(dist, INF, sizeof(dist));
dist[start][1<<start] = 0;
h.push(mkp(0, mkp(start, 1<<start)));
while(!h.empty())
{
int x = h.top().second.first;//x = nodul
int s = h.top().second.second;//multimea de noduri prina care s-a trecut pana la x
h.pop();
for(it = vk[x].begin(); it!=vk[x].end(); ++it)
{
int y = (*it).first;//y = nodul
int cost = (*it).second;//costul muchiei
if(!(s & (1<<y)))//daca nu am trecut prin y
{
int t = s | (1<<y);//il adaug in multime
if(dist[x][s] + cost < dist[y][t] )//daca distanta se micsoreaza
{
dist[y][t] = dist[x][s] + cost;
h.push( mkp(-dist[y][t], mkp(y,t) ) );//pun in heap
}
}
}
}
return dist[finish][ (1<<nk)-1 ];
}
void afiseaza(int sol)
{
freopen(outfile,"w",stdout);
printf("%d\n",sol);
fclose(stdout);
}
void rezolva()
{
vector <int> d;
d = dijkstra(start);
for (size_t i = 0; i < d.size(); ++i)
if (in_subset[i] && (int)i!=start)
vk[id_subset[start]].pb( mkp( id_subset[i], d[i] ) );
if (k == 0)
{
afiseaza(d[n-1]);
return;
}
for (size_t i = 0; i < subset.size(); ++ i)
if (subset[i] != start && subset[i] != finish)
{
d = dijkstra(subset[i]);
for (size_t j = 0; j < d.size(); ++ j)
if (in_subset[j] && subset[i] != (int)j)
vk[i].pb( mkp(id_subset[j], d[j] ) );
}
int answer = dijkstraK( id_subset[start], id_subset[finish], subset.size() );
afiseaza(answer);
}
int main()
{
citeste();
rezolva();
return 0;
}