#include using namespace std; #define INF 2000000000 #define MAXN 20050 #define MAXK 17 int N, M, a, b, c, d; vector > A[MAXN]; int fee, src, K; vector E; int ED[MAXK][MAXK]; int D[MAXN]; int dp[1 << MAXK]; priority_queue > S; void dijk(int st) { for (int i = 0; i < N; i++) { D[i] = INF; } D[st] = 0; S.push({0, st}); while (!S.empty()) { auto top = S.top(); S.pop(); int p = top.second; int d = top.first; if (D[p] != d) { continue; } for (auto e : A[p]) { if (D[p] + e.second < D[e.first]) { D[e.first] = D[p] + e.second; S.push({D[e.first], e.first}); } } } } void update(int mask, vector e) { int cost = fee; int total = (int) e.size(); cost += D[E[e[0]]]; for (int i = 0; i + 1 < total; i++) { cost += ED[e[i]][e[i + 1]]; } int nmask = mask; for (int i = 0; i < total; i++) { assert((nmask & (1 << e[i])) > 0); nmask ^= 1 << e[i]; } // if (nmask == 0 && mask == ((1 << K) - 1)) { // cerr << mask << ' ' << cost << endl; // for (int i = 0; i < total; i++) { // cerr << e[i] << ' '; // } // cerr << endl; // } dp[nmask] = min(dp[nmask], dp[mask] + cost); } int main() { // assert(freopen("taxies.in", "r", stdin)); // assert(freopen("taxies.out", "w", stdout)); cin.sync_with_stdio(false); cin >> N >> M; while (M--) { cin >> d >> a >> b >> c; a--; b--; A[a].push_back({b, c}); if (d == 2) { A[b].push_back({a, c}); } } cin >> fee >> src >> K; src--; for (int i = 0; i < K; i++) { cin >> a; a--; E.push_back(a); } for (int i = 0; i < K; i++) { dijk(E[i]); for (int j = 0; j < K; j++) { ED[i][j] = D[ E[j] ]; } } for (int mask = (1 << K) - 1; mask >= 0; mask--) { dp[mask] = INF; } dijk(src); int F[17], p; dp[(1 << K) - 1] = 0; for (int mask = (1 << K) - 1; mask; mask--) { p = 0; for (int i = 0; i < K; i++) { if ((mask & (1 << i)) > 0) { F[p++] = i; } } for (int i = 0; i < p; i++) { update(mask, {F[i]}); for (int j = 0; j < p; j++) { if (i != j) { update(mask, {F[i], F[j]}); for (int k = 0; k < p; k++) { if (k != i && k != j) { update(mask, {F[i], F[j], F[k]}); for (int q = 0; q < p; q++) { if (q != k && q != j && q != i) { update(mask, {F[i], F[j], F[k], F[q]}); } } } } } } } } // for (int i = 0; i < (1 << K); i++) { // cerr << i << ' ' << dp[i] << endl; // } // cerr << endl; cout << dp[0] << endl; return 0; }