#include<stdio.h>
using namespace std;
/*int N, M, K, i, C[2001], D[2001][2001], x, y;
int main() {
freopen ("ubuntzei.in", "r", stdin);
freopen ("ubuntzei.out", "w", stdout);
scanf ("%d %d %d", &N, &M, &K);
for (i = 1; i <= K; ++i)
scanf ("%d", &C[i]);
for (i = 1; i <= M; ++i) {
scanf ("%d %d %d", &x, &y, &D[x][y]);
drum[y][x] = D[x][y];
}
void dijkstra(int x0)
{
int i, j, min, k, ok;
int viz[NMAX], d[NMAX], tata[NMAX];
for (i = 1; i<=n; i++) {
d[i] = C[x0][i];
tata[i] = x0;
viz[i] = 0;
}
tata[x0] = 0;
viz[x0] = 1; ok = 1;
while (ok) {
min = INFINIT;
for (i = 1; i<=n; i++)
if (!viz[i] && min>d[i]) {
min = d[i];
k = i;
}
if (min != INFINIT) {
viz[k] = 1;
for (i = 1; i<=n; i++)
if (!viz[i] && d[i]>d[k]+C[k][i]) {
d[i] = d[k]+C[k][i];
tata[i] = k;
}
}
else ok = 0;
}
}
return 0;
}
*/
int N, M, K, i, loc[2001], a[2001][2001], x, y, k, j;
int main() {
freopen ("ubuntzei.in", "r", stdin);
freopen ("ubuntzei.out", "w", stdout);
scanf ("%d %d %d", &N, &M, &K);
for (i = 1; i <= K; ++i)
scanf ("%d", &loc[i]);
for (i = 1; i <= M; ++i)
scanf ("%d %d %d", &x, &y, &a[x][y]);
for (k = 1; k <= N; k++)
for (i = 1; i <= N; i++)
for (j = 1; j <= N; j++)
if (a[i][k] && a[k][j] && (a[i][j] > a[i][k] + a[k][j] || !a[i][j]) && i != j)
a[i][j] = a[i][k] + a[k][j];
/*for (i = 1; i <= N; ++i) {
for (j = 1; j <= N; ++j)
printf("%d ", a[i][j]);
printf("\n");
}*/
printf("%d\n", a[1][N]);
return 0;
}