//#define _GLIBCXX_DEBUG #include using namespace std; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define all(a) (a).begin(), (a).end() using ll = long long; const ll INF32 = 2e9; const ll INF64 = 4e18; vector dist; int N, M, K; vector A; vector> T; void printYN(bool ok){ if(ok)cout << "Yes" << endl; else cout << "No" << endl; return; } void dfs(int v, int d, int cnt, set &seen){ if(cnt==M){ dist[v] = min(dist[v], d); return; } rep(i, N){ if(seen.count(i))continue; seen.insert(i); dfs(i, d+T[v][i], cnt+1, seen); seen.erase(i); } } int main() { cin >> N >> M >> K; A.resize(K); rep(i, K){ cin >> A[i]; A[i]--; } dist.resize(N, INF32); T.resize(N, vector(N)); rep(i, N) rep(j, N)cin >> T[i][j]; rep(i, N){ set seen; seen.insert(i); dfs(i, 0, 1, seen); } vector ok(N, false); priority_queue, vector>, greater>> que; rep(i, N)que.push({dist[i], i}); while(!que.empty()){ auto fr = que.top(); int d = fr.first; int v = fr.second; que.pop(); if(ok[v])continue; ok[v] = true; for(int i = 0; i < N; i++){ if(i == v)continue; if(dist[i] > d + T[v][i]){ dist[i] = d + T[v][i]; que.push({dist[i], i}); } } } int ans = INF32; rep(i, K){ ans = min(ans, dist[A[i]]); } cout << ans << endl; return 0; }