#include <bits/stdc++.h>

using namespace std;

#define INF 1000000000
#define MAXN 50050
#define MAXK 17

int N, M, a, b, c, d;
vector<pair<int, int> > A[MAXN];
int fee, src, K;
vector<int> E;
int ED[MAXK][MAXK];
int D[MAXN];
int dp[1 << MAXK];

set<pair<int, int> > 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<int, int> top = S.top();
		pair<int, int> 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<int> 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;
		scanf("%d", &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++) {
			int costi = fee + D[E[F[i]]];
			int maski = mask ^ (1 << F[i]);
			dp[maski] = min(dp[maski], dp[mask] + costi);
			for (int j = 0; j < p; j++) {
				if (i != j) {
					int costj = costi + ED[F[i]][F[j]];
					int maskj = maski ^ (1 << F[j]);
					dp[maskj] = min(dp[maskj], dp[mask] + costj);
					for (int k = 0; k < p; k++) {
						if (k != i && k != j) {
							int costk = costj + ED[F[j]][F[k]];
							int maskk = maskj ^ (1 << F[k]);
							dp[maskk] = min(dp[maskk], dp[mask] + costk);
							for (int q = 0; q < p; q++) {
								if (q != k && q != j && q != i) {
									int costq = costk + ED[F[k]][F[q]];
									int maskq = maskk ^ (1 << F[q]);
									dp[maskq] = min(dp[maskq], dp[mask] + costq);
								}
							}
						}
					}
				}
			}
		}
	}

	// for (int i = 0; i < (1 << K); i++) {
	// 	cerr << i << ' ' << dp[i] << endl;
	// }
	// cerr << endl;

	cout << dp[0] << endl;

	return 0;
}