/*
ID:xpycc1
PROG:butter
LANG:C++
*/

#include <fstream>
#define MAXP 800
#define MAXN 500
using namespace std;

ifstream fin("butter.in");
ofstream fout("butter.out");

unsigned int n,p,c,path[MAXP+1][MAXP+1],dist[MAXP+1],scor[MAXN],
             cont[MAXP+1][MAXP+1],heap[MAXP+1],len,hash[MAXP+1];
bool isin[MAXP+1];

//以下的两个过程都是偷懒,从HumbleNumbles的那道题目的humble.pas里搬过来的,再用C++重写
void sift1(unsigned int x,unsigned pos){ //上滤
    unsigned int i,j;                    //i parent; j son
    j=pos?pos:++len; i=j/2;
    /* 
     *本来是直接写成j=pos;的, 
     *然后第一次进堆的东东自己在外面写++len这么一条; 
     *后来注意到第一次没有在堆中的点hash的值是0, 
     *要进堆的话还是从后面插入 
     *于是统一一下,就变成这个样子了 
     */
    while(i>0 && dist[x]<dist[heap[i]]){
        heap[j]=heap[i];
        hash[heap[j]]=j;
        j/=2; i/=2;
    }
    heap[j]=x; hash[x]=j;
}

void sift(){                              //下滤
    unsigned int i,j,t;
    i=1; j=i*2; t=heap[i];
    while(j<=len){
        if(j<len && dist[heap[j]]>dist[heap[j+1]]) ++j;
        if(dist[t]>=dist[heap[j]]){
            heap[i]=heap[j];
            hash[heap[i]]=i;
            i=j; j=i*2;
        }else break;
    }
    heap[i]=t; hash[t]=i;
}

int main(){
    unsigned int i,j,a,b,w,m,mm,u;
    fin>>n>>p>>c;
    for(i=0;i<n;++i)
        fin>>scor[i];
    for(i=0;i<c;++i){
        fin>>a>>b>>w;
        path[a][++cont[a][0]]=path[b][++cont[b][0]]=w;
        cont[a][cont[a][0]]=b;
        cont[b][cont[b][0]]=a;
    }
    m=0xFFFFFFFF;
    for(i=1;i<=p;++i){
        len=0;
        //初始化,没办法,就是这么烦
        memset(isin,false,sizeof(isin)); isin[i]=true;
        memset(heap,0,sizeof(heap));
        memset(hash,0,sizeof(hash));
        memset(dist,255,sizeof(dist)); dist[i]=0;
        for(j=1;j<=cont[i][0];++j){
            dist[cont[i][j]]=path[i][j];
            sift1(cont[i][j],0);   //从后面加入堆
        }
        while(len){
            u=heap[1];           //hash[u]=0;   去掉的两句调试的时候看起来方便点
            heap[1]=heap[len--]; //heap[len+1]=0;
            hash[heap[1]]=1;
            sift();
            isin[u]=true;
            //由于代码是移植过来的,所以原来的p就不能用了,否则一直错
            for(j=1;j<=cont[u][0];++j)
                if(!isin[cont[u][j]] && dist[cont[u][j]]>dist[u]+path[u][j]){
                    dist[cont[u][j]]=dist[u]+path[u][j];
                    sift1(cont[u][j],hash[cont[u][j]]);
                    //维护堆(修改或插入)
                }
        }
        mm=0;
        for(j=0;j<n;++j)
            //MS给出的图都是连通的,不过增加程序健壮性所以加上
            if(dist[scor[j]]==0xFFFFFFFF) continue;
            else mm+=dist[scor[j]];
        if(j==n && mm<m) m=mm;
    }

    fout<<m<<endl;
    return 0;
}