#include <bits/stdc++.h>
using namespace std;
long getMinimumServiceTime(int connection_nodes, vector<int> connection_from,
vector<int> connection_to, vector<int> connection_weight,
vector<int> clients) {
int m = connection_from.size();
vector<vector<pair<int, int>>> adj(connection_nodes);
for (int i = 0; i < m; i++) {
int u = connection_from[i];
int v = connection_to[i];
int w = connection_weight[i];
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
// Add headquarters (node 0) to clients list if not already there
vector<int> nodes;
nodes.push_back(0);
for (int c : clients) {
if (c != 0) nodes.push_back(c);
}
// Remove duplicates
sort(nodes.begin(), nodes.end());
nodes.erase(unique(nodes.begin(), nodes.end()), nodes.end());
int k = nodes.size();
vector<int> index_of(connection_nodes, -1);
for (int i = 0; i < k; i++) {
index_of[nodes[i]] = i;
}
// Dijkstra from each important node
const long INF = 1e18;
vector<vector<long>> dist(k, vector<long>(connection_nodes, INF));
for (int i = 0; i < k; i++) {
int start = nodes[i];
dist[i][start] = 0;
priority_queue<pair<long, int>, vector<pair<long, int>>, greater<pair<long, int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d != dist[i][u]) continue;
for (auto [v, w] : adj[u]) {
if (dist[i][v] > d + w) {
dist[i][v] = d + w;
pq.push({dist[i][v], v});
}
}
}
}
// Build distance matrix between important nodes
vector<vector<long>> dmat(k, vector<long>(k, INF));
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
dmat[i][j] = dist[i][nodes[j]];
}
}
// Check connectivity
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
if (dmat[i][j] >= INF) return -1;
}
}
// TSP DP
int fullmask = (1 << k) - 1;
vector<vector<long>> dp(fullmask + 1, vector<long>(k, INF));
dp[1][0] = 0; // start at node 0 (which is index 0 in nodes array)
for (int mask = 1; mask <= fullmask; mask++) {
for (int last = 0; last < k; last++) {
if (!(mask & (1 << last))) continue;
if (dp[mask][last] >= INF) continue;
for (int nxt = 0; nxt < k; nxt++) {
if (mask & (1 << nxt)) continue;
int newmask = mask | (1 << nxt);
dp[newmask][nxt] = min(dp[newmask][nxt], dp[mask][last] + dmat[last][nxt]);
}
}
}
long ans = INF;
for (int last = 0; last < k; last++) {
if (dp[fullmask][last] < INF) {
ans = min(ans, dp[fullmask][last] + dmat[last][0]);
}
}
return ans;
}
int main() {
int connection_nodes, m;
cin >> connection_nodes >> m;
vector<int> connection_from(m), connection_to(m), connection_weight(m);
for (int i = 0; i < m; i++) {
cin >> connection_from[i] >> connection_to[i] >> connection_weight[i];
}
int k;
cin >> k;
vector<int> clients(k);
for (int i = 0; i < k; i++) {
cin >> clients[i];
}
long result = getMinimumServiceTime(connection_nodes, connection_from, connection_to, connection_weight, clients);
cout << result << endl;
return 0;
}