#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <time.h>
using namespace std;
#define MAX_N 760
#define MAX_M 1600
#define MAX_K 16
#define pb push_back
#define mp make_pair
#define x first
#define y second
#define PII pair<int, int>
#define INF 1000000000
#define b(x) (1<<(x))
int N, M, K, Min[1<<15][MAX_K], A[17][17][17];
int cnt[1<<MAX_K], P[MAX_K], D[MAX_N];
vector<PII> G[MAX_N];
vector<int> Lim[MAX_N];
queue<int> Q;
inline int MIN(int a, int b) { return a < b ? a : b; }
void baga(int src, int mmax)
{
int i, j, k;
for(i = 1; i <= N; i++) D[i] = INF;
Q.push(src), D[src] = 0;
while(Q.size() > 0)
{
j = Q.front(), Q.pop();
for(k = 0; k < G[j].size(); k++)
if(D[j]+G[j][k].y < D[ G[j][k].x ] && Lim[j][k] >= mmax)
D[ G[j][k].x ] = D[j]+G[j][k].y, Q.push(G[j][k].x);
}
}
void ruleaza(void)
{
int i, j, k, a, b, c, d, res, conf, conf2, x, y, ret;
scanf("%d %d %d", &K, &N, &M);
for(P[0] = 1, i = 1; i <= K; i++) scanf("%d ", &P[i]);
for(i = 1; i <= M; i++)
{
scanf("%d %d %d %d\n", &a, &b, &c, &d);
G[a].pb( mp(b, c) ), G[b].pb( mp(a, c) );
Lim[a].pb(d+1), Lim[b].pb(d+1);
}
for(i = 1; i < b(MAX_K); i++) cnt[i] = cnt[i>>1]+(i&1);
for(i = 0; i < b(MAX_K); i++) cnt[i]++;
for(i = 0; i <= K; i++)
for(j = 1; j <= K+1; j++)
{
baga(P[i], j);
for(k = 0; k <= K; k++)
A[i][k][j] = D[P[k]];
}
for(conf = 0; conf < (1<<K); conf++)
for(x = 0; x <= K; x++)
Min[conf][x] = INF;
Min[0][0] = 0;
for(conf = 1; conf < (1<<K); conf++)
for(x = 1; x <= K; x++)
if(conf&b(x-1))
{
for(ret = INF, y = 0; y <= K; y++)
if(x != y && A[y][x][cnt[conf2=conf^b(x-1)]] != INF)
ret = MIN(ret, Min[conf2][y]+A[y][x][cnt[conf2]]*cnt[conf2]);
Min[conf][x] = ret;
}
for(res = INF, i = 1; i <= K; i++)
res = MIN(res, Min[b(K)-1][i]);
printf("%d\n", res);
}
int main(void)
{
freopen("gather.in", "rt", stdin);
freopen("gather.out", "wt", stdout);
ruleaza();
return 0;
}