fn read_line() -> String {
use std::io::stdin;
let mut s = String::new();
stdin().read_line(&mut s).unwrap();
s
}
use std::str::FromStr;
use std::fmt::Debug;
fn parse3<T: FromStr>(s: String) -> (T, T, T) where <T as FromStr>::Err: Debug {
let mut it = s.split_whitespace();
let a = it.next().unwrap().parse().unwrap();
let b = it.next().unwrap().parse().unwrap();
let c = it.next().unwrap().parse().unwrap();
(a, b, c)
}
fn parse_all<T: FromStr>(s: String) -> Vec<T> where <T as FromStr>::Err: Debug {
s.split_whitespace().map(|e| e.parse().unwrap()).collect()
}
const LARGE: usize = 100000 * 2000;
fn dfs(roads: &Vec<Vec<usize>>, targets: &Vec<usize>, visited: &mut Vec<bool>, arr: &mut Vec<usize>, depth: usize) -> usize {
let r = arr.len();
let mut best = LARGE;
if depth == r {
let mut x = 0;
for i in 1..r {
x += roads[arr[i-1]][arr[i]];
}
//println!("{:?}: {}", arr, x);
return x;
} else {
for i in 0..r {
if !visited[i] {
visited[i] = true;
arr[depth] = targets[i];
let v = dfs(roads, targets, visited, arr, depth + 1);
if v < best {
best = v;
}
visited[i] = false;
}
}
return best;
}
}
fn main() {
let (n, m, r) = parse3::<usize>(read_line());
let targets: Vec<usize> = parse_all(read_line());
let mut roads: Vec<Vec<usize>> = vec![vec![LARGE; n+1]; n+1];
for i in 1..n+1 {
roads[i][i] = 0;
}
for _ in 0..m {
let (a, b, c) = parse3::<usize>(read_line());
roads[a][b] = c;
roads[b][a] = c;
}
// Warshall-Floyd
for k in 1..n+1 {
for i in 1..n+1 {
for j in 1..n+1 {
if roads[i][j] > roads[i][k] + roads[k][j] {
roads[i][j] = roads[i][k] + roads[k][j];
roads[j][i] = roads[i][j];
}
}
}
}
let mut visited = vec![false; r];
let mut arr = vec![0; r];
let result = dfs(&roads, &targets, &mut visited, &mut arr, 0);
println!("{}", result);
}