#include<cstdio>
#include<cstring>
#include<algorithm>
const int inf = 1000 * 1000 * 1000;
using namespace std;
const int maxn = 505;
const int maxp = 55;
int i , j , n , m , p , a , b , c , d[maxn][maxn] , dp[maxn][maxp][maxp], dest[maxn] , k;
bool calc[maxn][maxp][maxp];
int ret(int nod, int left, int right) {
if(left > right)
return 0;
int ans = inf;
int i , l , r;
if(calc[nod][left][right])
return dp[nod][left][right];
bool ok = false;
for(i = left; i <= right; ++i)
ans = min(ans , ret(dest[i] , left , i - 1) + ret(dest[i] , i + 1 , right) + d[nod][dest[i]]);
//printf("%d %d %d %d\n",nod,left,right , ans);
calc[nod][left][right] = true;
dp[nod][left][right] = ans;
return ans;
}
int main()
{
freopen("team.in","r",stdin);
freopen("team.out","w",stdout);
scanf("%d\n%d\n%d",&p,&n,&m);
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
d[i][j] = inf;
for(i = 1; i <= m; ++i) {
scanf("%d %d %d",&a,&b,&c);
d[a][b] = d[b][a] = c;
}
for(k = 1; k <= n; ++k)
for(i = 1; i <= n; ++i)
for(j = 1 ; j <= n ; ++j)
if(i != j)
d[i][j] = min(d[i][k] + d[k][j], d[i][j]);
else
d[i][j] = 0;
for(i = 1; i <= p; ++i)
scanf("%d",&dest[i]);
//ret(2 , 3 , 4);
printf("%d\n",ret(1 , 1 , p));
return 0;
}