#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#define inf 1000000000
#define BIT(x) (1<<x)
#define min(x,y) (x<y?x:y)
using namespace std;
bool cmp(const pair<int, int>& a, const pair<int, int>& b)
{
return a.second > b.second;
}
vector< pair<int, int> > v[2000];
vector< pair<int, int> > h;
int dist[16][2000] = {{0}};
bool viz[2000] = {0};
int n, m;
int k, vk[16];
int mat[16][BIT(16)];
void dijkstra(int start, int res)
{
int i, a;
memset(viz, 0, sizeof(viz));
viz[start] = 1;
for(i = 0; i < n; i++)
dist[res][i] = inf;
dist[res][start] = 0;
for(i = 0; i < v[start].size(); i++)
{
h.push_back(v[start][i]);
dist[res][v[start][i].first] = v[start][i].second;
}
make_heap(h.begin(), h.end(), cmp);
while(!h.empty())
{
a = h[0].first;
pop_heap(h.begin(), h.end(), cmp);
h.pop_back();
if(viz[a])
continue;
viz[a] = 1;
for(i = 0; i < v[a].size(); i++)
{
if(dist[res][v[a][i].first] > dist[res][a] + v[a][i].second)
{
dist[res][v[a][i].first] = dist[res][a] + v[a][i].second;
h.push_back(make_pair(v[a][i].first, dist[res][v[a][i].first]));
push_heap(h.begin(), h.end(), cmp);
}
}
}
}
int main()
{
int i, j, k, a, b, c, l;
freopen("ubuntzei.in", "r", stdin);
freopen("ubuntzei.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
vk[0] = 0;
for(i = 1; i <= k; i++)
{
scanf("%d", &vk[i]);
vk[i]--;
}
for(i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
a--; b--;
v[a].push_back(make_pair(b, c));
v[b].push_back(make_pair(a, c));
}
dijkstra(0, 0);
for(i = 1; i <= k; i++)
dijkstra(vk[i], i);
if(k == 0)
{
printf("%d", dist[0][n - 1]);
return 0;
}
for(i = 0; i < BIT(k + 1); i++) for(j = 0; j < k + 1; j++) mat[j][i] = inf;
mat[0][1] = 0;
for(i = 3; i < BIT(k + 1); i += 2)
{
for(j = 1; j < k + 1; j++)
{
mat[j][i] = inf;
if((i & BIT(j)) == 0)
continue;
for(l = 0; l < k + 1; l++)
{
if((i & BIT(l)) == 0)
continue;
mat[j][i] = min(mat[j][i], mat[l][i - BIT(j)] + dist[j][vk[l]]);
}
}
}
int sol = inf;
for(i = 1; i <= k; i++)
{
sol = min(sol, mat[i][BIT(k + 1) - 1] + dist[i][n - 1]);
}
printf("%d", sol);
return 0;
}