#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const ll INF = (1LL << 60);

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m, R;
    if (!(cin >> n >> m >> R)) return 0;

    vector<int> must(R);
    for (int i = 0; i < R; ++i) cin >> must[i];

    vector<vector<pair<int, int>>> g(n + 1);
    for (int i = 0; i < m; ++i) {
        int a, b, c;
        cin >> a >> b >> c;
        g[a].push_back({b, c});
        g[b].push_back({a, c});
    }

    // 1) 只对 R 个必游点跑 Dijkstra,得到它们之间的两两最短路
    vector<vector<ll>> distR(R, vector<ll>(n + 1, INF));
    auto dijkstra = [&](int srcIdx) {
        int s = must[srcIdx];
        auto& dist = distR[srcIdx];
        priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
        dist[s] = 0;
        pq.push({0, s});
        while (!pq.empty()) {
            auto [d, u] = pq.top();
            pq.pop();
            if (d != dist[u]) continue;
            for (auto [v, w] : g[u]) {
                if (dist[v] > d + w) {
                    dist[v] = d + w;
                    pq.push({dist[v], v});
                }
            }
        }
    };
    for (int i = 0; i < R; ++i) dijkstra(i);

    // 构建 R x R 的最短路矩阵
    vector<vector<ll>> w(R, vector<ll>(R, INF));
    for (int i = 0; i < R; ++i)
        for (int j = 0; j < R; ++j)
            w[i][j] = distR[i][ must[j] ];

    // 2) 状态压缩 TSP(开放式路径):dp[mask][i] 以 i 结尾、走过 mask 的最小代价
    int FULL = (1 << R);
    vector<vector<ll>> dp(FULL, vector<ll>(R, INF));
    for (int i = 0; i < R;
            ++i) dp[1 << i][i] = 0; // 第一段去 V_i 的费用免费(题意)

    for (int mask = 0; mask < FULL; ++mask) {
        for (int i = 0; i < R; ++i) if (dp[mask][i] < INF) {
                for (int j = 0; j < R; ++j) if (!(mask & (1 << j))) {
                        if (w[i][j] >= INF) continue;  // 不连通则跳过
                        int nmask = mask | (1 << j);
                        dp[nmask][j] = min(dp[nmask][j], dp[mask][i] + w[i][j]);
                    }
            }
    }

    ll ans = INF;
    for (int i = 0; i < R;
            ++i) ans = min(ans, dp[FULL - 1][i]); // 最后一段回学校免费
    cout << ans << '\n';
    return 0;
}