N, M, K = map(int, input().split()) A = set(map(lambda x: int(x) - 1, input().split())) T = [list(map(int, input().split())) for _ in range(N)] INF = 10 ** 18 ans = INF # bit DP # dp[visited][last] = 最後に訪れた場所がlast で、訪れた場所の集合がvisited であるときの、時間の最小値 dp = [[INF] * N for _ in range(1 << N)] # 1か所だけ訪れるパターンは0 for i in range(N): dp[1 << i][i] = 0 for visited in range(1 << N): for next_last in range(N): if visited & (1 << next_last): # 既にnext_last を訪れていたら何もしない continue new_visited = visited + (1 << next_last) for last in range(N): # 既に訪れている場所の中で、最後に訪れた場所を全探索 if visited & (1 << last): dp[new_visited][next_last] = min(dp[new_visited][next_last], dp[visited][last] + T[last][next_last]) for visited in range(1 << N): if visited.bit_count() < M: continue for last in A: ans = min(ans, dp[visited][last]) print(ans)