// - YDK - {{{
#include <functional>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <numeric>
#include <string>
#include <cstdio>
#include <vector>
#include <tuple>
#include <cmath>
#include <queue>
#include <regex>
#include <set>
#include <map>
using namespace std;
#define eb          emplace_back
#define emp         emplace
#define fi          first
#define se          second
#define debug(...)  fprintf(stderr, __VA_ARGS__ )
#define outl(x)     out < (x) < '\n'
#define outl2(x,y)  out < (x) < ' ' < (y) < '\n'
#define rep(i,n)    for(int i=0; i<(int)(n); ++i)
#define ALL(x)      x.begin(), x.end()
#define ODD(n)      ((n)&1)
#define EVEN(n)     (!ODD(n))
#define _NAMESPACE_YDK_ namespace ydk {
#define _END_NAMESPACE_ }
template<class A, class B>inline bool chmax(A &a, B b){return b>a ? a=b,1 : 0;}
template<class A, class B>inline bool chmin(A &a, B b){return b<a ? a=b,1 : 0;}
template<class T>using MinHeap = priority_queue< T, vector<T>, greater<T> >;
using ll  = long long;
using pii = pair<int, int>;
inline bool inside(int x, int y, int W, int H) { return x>=0 && y>=0 && x<W && y<H; }
constexpr int       INF  = 0x3f3f3f3f;
constexpr long long LINF = 0x3f3f3f3f3f3f3f3fLL;
constexpr int dx[] = {1, 0, -1, 0};
constexpr int dy[] = {0, 1, 0, -1};
struct Point: public pii {
    int &x = this->first,   &y = this->second;
    explicit Point(int x=0, int y=0): pii(x, y) {}
};
struct Writer
{
    static constexpr size_t BUFF_SIZE = 1 << 18;
    static char _buf[BUFF_SIZE];
    explicit Writer() { setvbuf(stdout, _buf, _IOFBF, sizeof(_buf)); }
    inline void    ln()         {putchar('\n');}
    inline Writer& operator() (int n)   {printf("%d", n);                return *this;}
    inline Writer& operator() (ll  n)   {printf("%lld", n);              return *this;}
    inline Writer& operator() (char c)  {printf("%c", c);                return *this;}
    inline Writer& operator() (double d){printf("%lf", d);               return *this;}
    inline Writer& operator() (const char* s){printf("%s", s);           return *this;}
    inline Writer& operator() (const string &s){printf("%s", s.c_str()); return *this;}
    inline Writer& operator() (bool f)  {printf("%s", f?"true":"false"); return *this;}
    inline Writer& operator() (void)  {putchar('\n'); return *this;}

    template<class InputIterator>
    inline Writer& operator() (InputIterator first, InputIterator last, const char *space=" ")
    {
        for(; first != last; ++first) {
            (*this)(*first);
            printf("%s", (first+1 == last)? "\n" : space);
        }
        return *this;
    }
};
char Writer::_buf[BUFF_SIZE];
template<class T> inline Writer& operator < (Writer &o, const T &v) { return o(v); }

struct Scanner
{
    char tmp[65536];
    inline Scanner& read(int &n)    {scanf("%d", &n);       return *this;}
    inline Scanner& read(ll  &n)    {scanf("%lld", &n);     return *this;}
    inline Scanner& read(char &c)   {scanf(" %c", &c);      return *this;}
    inline Scanner& read(double &d) {scanf("%lf", &d);      return *this;}
    inline Scanner& read(char *s)   {scanf("%s", s);        return *this;}
    inline Scanner& read(string &s) {scanf("%s",tmp); s=string(tmp); return*this;}
};
template<class T> inline Scanner& operator > (Scanner &in, T &v) { return in.read(v); }
template<class T> inline Scanner& operator , (Scanner &in, T &v) { return in.read(v); }
Writer  out;
Scanner in;
// }}}

_NAMESPACE_YDK_

constexpr int LIM = 205;

int N, M, R;
int r[10];
int G[LIM][LIM];

int dst[10];

int junretsu(int idx, int bit) {
    if (idx == R)
    {
        int ret = 0;
        for (int i = 1; i < R; ++i) {
            ret += G[dst[i-1]][dst[i]];
        }
        return ret;
    }

    int ret = INF;
    rep(i, R) {
        if ((bit >> i) & 1) continue;
        dst[idx] = r[i];
        int p = junretsu(idx+1, bit | (1 << i));
        chmin(ret, p);
    }

    return ret;
}

signed main(void)
{
    in> N, M, R;
    rep(i, R) {
        in> r[i];
    }

    memset(G, INF, sizeof(G));
    rep(i, LIM) G[i][i] = 0;

    rep(i, M) {
        int a, b, c;
        in> a, b, c;
        G[a][b] = G[b][a] = c;
    }

    rep(k, LIM) {
        rep(i, LIM) {
            if (G[i][k] == INF) continue;
            rep(j, LIM) {
                if (G[k][j] == INF) continue;
                chmin(G[i][j], G[i][k] + G[k][j]);
            }
        }
    }

    /*
    for (int i = 1; i<= N; ++i) {
        for (int j= 1; j<=N; ++j) {
            debug("%3d ", G[i][j]);
        }
        debug("\n");
    }
    */

    outl(junretsu(0, 0));

    return 0;
}

_END_NAMESPACE_

signed main(void) { return ydk::main(); }

//--------END--------



Measured memory_bytes: 384