#include <fstream>
#include <functional>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
const int nMax = 2005, oo = 20000000, cmax = 1 << 18;
vector <pair<int, int>> g[nMax], newg[20];
int v[20], n, m, k, dp[nMax], a[20][20], cfg[cmax][20];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
void Dijkstra(int smth, int ind) {
for (int i = 1; i <= n; i++)
dp[i] = oo;
pq.push({0, smth});
dp[smth] = 0;
while (!pq.empty()) {
int nod = pq.top().second, cost = pq.top().first;
pq.pop();
if (dp[nod] != cost)
continue;
for (auto i : g[nod])
if (dp[nod] + i.second < dp[i.first]) {
dp[i.first] = dp[nod] + i.second;
pq.push({dp[i.first], i.first});
}
}
for (int i = 0; i <= k; i++)
a[ind][i] = dp[v[i]];
}
void Solve() {
int f = 1 << (k + 1);
f--;
for (int i = 0; i <= f; i++)
for (int j = 0; j <= k; j++)
cfg[i][j] = oo;
cfg[1][0] = 0;
for (int i = 1; i <= f; i++) {
if (i & 1 == 0)
continue;
for (int j = 0; j <= k; j++) {
if ((i & (1 << j)) == 0)
continue;
for (int p = 0; p <= k; p++)
if ((i & (1 << p)) && a[j][p])
cfg[i][j] = min(cfg[i][j], cfg[i - (1 << j)][p] + a[j][p]);
}
}
fout << cfg[f][k] << '\n';
}
int main() {
fin >> n >> m;
fin >> k;
for (int i = 1; i <= k; i++)
fin >> v[i];
v[0] = 1;
v[k + 1] = n;
k++;
for (int i = 1; i <= m; i++) {
int x, y, z;
fin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
for (int i = 1; i <= k; i++)
Dijkstra(v[i], i);
Solve();
}