include[HTML_REMOVED]
define pii pair[HTML_REMOVED]
using namespace std;
const int M = 1010;
int n, m, s, w, ans = 1e9 + 7;
struct node{
int to, v;
};
vector[HTML_REMOVED] e[M];
void add(int a, int b, int c) {
e[a].push_back({b, c});
}
int dist[M], vis[M], flag;
void dij(int star) {
priority_queue[HTML_REMOVED], greater[HTML_REMOVED] > q;
memset(vis, 0, sizeof vis);
memset(dist, 0x3f3f3f3f, sizeof dist);
dist[star] = 0;
q.push(make_pair(0, star));
while (!q.empty()) {
int now = q.top().second; q.pop();
if (vis[now]) continue;
for (int i = 0;i < e[now].size();i ++) {
int to = e[now][i].to, v = e[now][i].v;
if (to == s && !flag) flag = true;
if (dist[to] > dist[now] + v) {
dist[to] = dist[now] + v;
q.push(make_pair(dist[to], to));
}
}
}
}
int main(){
while (scanf("%d%d%d", &n, &m, &s) != -1) {
ans = 0x3f3f3f3f; flag = false;
for (int i = 1;i <= m;i ++) {
int p, q, t;
cin >> p >> q >> t;
add(p, q, t);
}
cin >> w;// cout << w << endl;
for (int i = 1;i <= w;i ++) {
int temp; cin >> temp;
dij(temp);
//cout << dist[s] << endl;
ans = min(ans, dist[s]);
}
if(flag) cout << ans << endl;
else cout << -1 << endl;
}
return 0;
}