#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const long long INF = 1e18;
struct Edge {
int to;
long long weight;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, k, m;
cin >> n >> k >> m;
vector<int> important_cities(k);
for (int i = 0; i < k; i++) {
cin >> important_cities[i];
}
vector<vector<Edge>> adj(n + 1);
for (int i = 0; i < m; i++) {
int u, v;
long long c;
cin >> u >> v >> c;
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
// dp[mask][i] - mask dagi muhim shaharlarni i shahri orqali
// bog'lashning minimal narxi
vector<vector<long long>> dp(1 << k, vector<long long>(n + 1, INF));
for (int i = 0; i < k; i++) {
dp[1 << i][important_cities[i]] = 0;
}
for (int mask = 1; mask < (1 << k); mask++) {
// 1. Kichik masklardan kattasini hosil qilish (Submask DP)
for (int submask = (mask - 1) & mask; submask > 0; submask = (submask - 1) & mask) {
for (int i = 1; i <= n; i++) {
if (dp[submask][i] != INF && dp[mask ^ submask][i] != INF) {
dp[mask][i] = min(dp[mask][i], dp[submask][i] + dp[mask ^ submask][i]);
}
}
}
// 2. Bir xil mask ichida shaharlararo masofani optimallashtirish (Dijkstra)
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
for (int i = 1; i <= n; i++) {
if (dp[mask][i] != INF) {
pq.push({dp[mask][i], i});
}
}
while (!pq.empty()) {
long long d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > dp[mask][u]) continue;
for (auto &edge : adj[u]) {
if (dp[mask][edge.to] > d + edge.weight) {
dp[mask][edge.to] = d + edge.weight;
pq.push({dp[mask][edge.to], edge.to});
}
}
}
}
// Yakuniy javob: barcha k shaharlar bog'langan mask (1<<k - 1)
long long ans = INF;
for (int i = 1; i <= n; i++) {
ans = min(ans, dp[(1 << k) - 1][i]);
}
cout << ans << endl;
return 0;
}