#include #include using namespace std; using namespace atcoder; typedef long long ll; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) static const double pi = 3.141592653589793; const ll INF = 1LL << 60; const ll mod = 1000000007; const ll imod = 998244353; using mint = modint998244353; vector dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1}; ll P(ll x, ll n) { ll ret = 1; while (n > 0) { if (n & 1) ret *= x; x *= x; n >>= 1; } return ret; } void seek(bool f){ cout << (f ? "Yes" : "No") << endl; } int main(){ int N, M, K; cin >> N >> M >> K; vector OK(N, 0); rep(i, K){ int x; cin >> x; x--; OK[x] = 1; } vector> T(N, vector (N)); rep(i, N){ rep(j, N){ cin >> T[i][j]; } } vector order(N, 0); rep(i, M){ order[i] = 1; } sort(order.begin(), order.end()); int ans = 1e9; do{ vector A; rep(i, N){ if(order[i] == 1){ A.push_back(i); } } do{ int res = 0; rep(j, M - 1){ res += T[A[j]][A[j + 1]]; } if(OK[A[M - 1]] == 0){ int add = 1e9; rep(k, N){ if(OK[k] == 1){ add = min(add, T[A[M - 1]][k]); } } res += add; } ans = min(ans, res); }while(next_permutation(A.begin(), A.end())); }while(next_permutation(order.begin(), order.end())); cout << ans << endl; }