#include using namespace std; #define INF 2000000000 #define MAXN 50050 #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]; set > S; void dijk(int st) { for (int i = 0; i < N; i++) { D[i] = INF; } assert(S.size() == 0); D[st] = 0; S.insert({0, st}); // S.push({0, st}); // int it = 0; while (!S.empty()) { // pair top = S.top(); pair top = *S.begin(); int p = top.second; assert(0 <= p && p < N); int d = top.first; S.erase(S.begin()); // S.pop(); if (D[p] != d) { continue; } // it++; // if (it % 1000000 == 0) { // cerr << it << ' ' << S.size() << endl; // } for (auto e : A[p]) { if (D[p] + e.second < D[e.first]) { D[e.first] = D[p] + e.second; S.insert({D[e.first], e.first}); // 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++) { nmask ^= 1 << e[i]; } 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); scanf("%d %d", &N, &M); // cin >> N >> M; while (M--) { scanf("%d %d %d %d", &d, &a, &b, &c); // cin >> d >> a >> b >> c; a--; b--; A[a].push_back({b, c}); if (d == 2) { A[b].push_back({a, c}); } } scanf("%d %d %d", &fee, &src, &K); // 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++) { cerr << i << endl; 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); cerr << "OK\n"; 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; }