output_description: Print the distance traveled by road if Joisino visits the towns in the order
  that minimizes it.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N M R
      r_1 ... r_R
      A_1 B_1 C_1
      :
      A_M B_M C_M
attempt: import sys
  import heapq
  import re
  from itertools import permutations
  from bisect import bisect_left, bisect_right
  from collections import Counter, deque
  from math import factorial, sqrt, ceil, gcd
  from functools import lru_cache, reduce
  from decimal import Decimal
  from operator import mul
  
  INF = 1 << 60
  MOD = 1000000007
  sys.setrecursionlimit(10**7)
  
  
  # UnionFind
  class UnionFind:
      def __init__(self, n):
          self.n = n
          self.parents = [-1] * n
  
      def find(self, x):
          if self.parents[x] < 0:
              return x
          else:
              self.parents[x] = self.find(self.parents[x])
              return self.parents[x]
  
      def union(self, x, y):
          x = self.find(x)
          y = self.find(y)
  
          if x == y:
              return
  
          if self.parents[x] > self.parents[y]:
              x, y = y, x
  
          self.parents[x] += self.parents[y]
          self.parents[y] = x
  
      def size(self, x):
          return -self.parents[self.find(x)]
  
      def same(self, x, y):
          return self.find(x) == self.find(y)
  
      def members(self, x):
          root = self.find(x)
          return [i for i in range(self.n) if self.find(i) == root]
  
      def roots(self):
          return [i for i, x in enumerate(self.parents) if x < 0]
  
      def group_count(self):
          return len(self.roots())
  
      def all_group_members(self):
          return {r: self.members(r) for r in self.roots()}
  
      def __str__(self):
          return "\n".join("{}: {}".format(r, self.members(r)) for r in self.roots())
  
  
  # ダイクストラ
  def dijkstra_heap(s, edge, n):
      # 始点sから各頂点への最短距離
      d = [10**20] * n
      used = [True] * n  # True:未確定
      d[s] = 0
      used[s] = False
      edgelist = []
      for a, b in edge[s]:
          heapq.heappush(edgelist, a * (10**6) + b)
      while len(edgelist):
          minedge = heapq.heappop(edgelist)
          # まだ使われてない頂点の中から最小の距離のものを探す
          if not used[minedge % (10**6)]:
              continue
          v = minedge % (10**6)
          d[v] = minedge // (10**6)
          used[v] = False
          for e in edge[v]:
              if used[e[1]]:
                  heapq.heappush(edgelist, (e[0] + d[v]) * (10**6) + e[1])
      return d
  
  
  # 素因数分解
  def factorization(n):
      arr = []
      temp = n
      for i in range(2, int(-(-(n**0.5) // 1)) + 1):
          if temp % i == 0:
              cnt = 0
              while temp % i == 0:
                  cnt += 1
                  temp //= i
              arr.append([i, cnt])
  
      if temp != 1:
          arr.append([temp, 1])
  
      if arr == []:
          arr.append([n, 1])
  
      return arr
  
  
  # 組合せnCr
  def combinations_count(n, r):
      if n < r:
          return 0
      r = min(r, n - r)
      numer = reduce(mul, range(n, n - r, -1), 1)
      denom = reduce(mul, range(1, r + 1), 1)
      return numer // denom
  
  
  # 2数の最小公倍数
  def lcm(x, y):
      return (x * y) // gcd(x, y)
  
  
  # リストの要素の最小公倍数
  def lcm_list(numbers):
      return reduce(lcm, numbers, 1)
  
  
  # リストの要素の最大公約数
  def gcd_list(numbers):
      return reduce(gcd, numbers)
  
  
  # 素数判定
  def is_prime(n):
      if n <= 1:
          return False
      p = 2
      while True:
          if p**2 > n:
              break
          if n % p == 0:
              return False
          p += 1
      return True
  
  
  # limit以下の素数を列挙
  def eratosthenes(limit):
      A = [i for i in range(2, limit + 1)]
      P = []
  
      while True:
          prime = min(A)
  
          if prime > sqrt(limit):
              break
  
          P.append(prime)
  
          i = 0
          while i < len(A):
              if A[i] % prime == 0:
                  A.pop(i)
                  continue
              i += 1
  
      for a in A:
          P.append(a)
  
      return P
  
  
  # 同じものを含む順列
  def permutation_with_duplicates(L):
  
      if L == []:
          return [[]]
  
      else:
          ret = []
  
          # set（集合）型で重複を削除、ソート
          S = sorted(set(L))
  
          for i in S:
  
              data = L[:]
              data.remove(i)
  
              for j in permutation_with_duplicates(data):
                  ret.append([i] + j)
  
          return ret
  
  
  def make_divisors(n):
      lower_divisors, upper_divisors = [], []
      i = 1
      while i * i <= n:
          if n % i == 0:
              lower_divisors.append(i)
              if i != n // i:
                  upper_divisors.append(n // i)
          i += 1
      return lower_divisors + upper_divisors[::-1]
  
  
  # ここから書き始める
  n, m, r = map(int, input().split())
  cities = list(map(int, input().split()))
  a = [0 for i in range(m)]
  b = [0 for i in range(m)]
  c = [0 for i in range(m)]
  for i in range(m):
      a[i], b[i], c[i] = map(int, input().split())
      a[i] -= 1
      b[i] -= 1
  
  d = [[INF for j in range(n)] for i in range(n)]
  for i in range(m):
      d[a[i]][b[i]] = c[i]
      d[b[i]][a[i]] = c[i]
  for i in range(n):
      d[i][i] = 0
  
  for k in range(n):
      for i in range(n):
          for j in range(n):
              d[i][j] = min(d[i][j], d[i][k] + d[k][j])
  
  ans = INF
  for i in permutations(cities):
      total = 0
      for j in range(1, r):
          total += d[i[j] - 1][i[j - 1] - 1]
      ans = min(ans, total)
  print(ans)
  
problem_description: Statement
  
  There are N towns in the State of Atcoder, connected by M bidirectional roads.
  
  The i-th road connects Town A_i and B_i and has a length of C_i.
  
  Joisino is visiting R towns in the state, r_1,r_2,..,r_R (not necessarily in
  this order).
  
  She will fly to the first town she visits, and fly back from the last town she
  visits, but for the rest of the trip she will have to travel by road.
  
  If she visits the towns in the order that minimizes the distance traveled by
  road, what will that distance be?
samples: [{"input": "3 3 3\n    1 2 3\n    1 2 1\n    2 3 1\n    3 1 4", "output": "2\n    \n\nFor example, if she visits the towns in the order of 1, 2, 3, the distance\ntraveled will be 2, which is the minimum possible.\n\n* * *"}, {"input": "3 3 2\n    1 3\n    2 3 2\n    1 3 6\n    1 2 2", "output": "4\n    \n\nThe shortest distance between Towns 1 and 3 is 4. Thus, whether she visits\nTown 1 or 3 first, the distance traveled will be 4.\n\n* * *"}, {"input": "4 6 3\n    2 3 4\n    1 2 4\n    2 3 3\n    4 3 1\n    1 4 1\n    4 2 2\n    3 1 6", "output": "3"}]