#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node {
ll d;
int id;
int s;
bool operator<(const node& a) const {
return d < a.d;
}
};
int main() {
int T;
cin >> T;
while (T--) {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> G(n), c(n);
for (int i = 0; i < m; ++i) {
int u, v, w;
cin >> u >> v >> w;
--u;
--v;
if (u == v)
continue;
if (u == -1 || v == -1) // 去掉这行和下一行就会RE
continue;
G[u].push_back(v);
c[u].push_back(w);
}
vector<bool> a(n, false);
vector<pair<ll, int>> d1(n, make_pair(1000000000000000000, -1)), d2(n, make_pair(1000000000000000000, -2));
set<node> s;
for (int i = 0; i < k; ++i) {
int v;
cin >> v;
--v;
a[v] = true;
d1[v] = make_pair(0, v);
s.insert((node) { 0, v, v });
}
while (!s.empty()) {
node p = *(s.begin());
ll cd = p.d;
int v = p.id;
if (a[v] && cd == d2[v].first) {
cout << d2[v].first << endl;
break;
}
s.erase(p);
for (int i = 0; i < G[v].size(); ++i) {
if (d1[G[v][i]].first > cd + c[v][i]) {
if (d1[G[v][i]].second == p.s) {
s.erase((node) {d1[G[v][i]].first, G[v][i], d1[G[v][i]].second});
d1[G[v][i]] = make_pair(cd + c[v][i], p.s);
s.insert((node) {cd + c[v][i], G[v][i], p.s});
}
else {
s.erase((node) {d2[G[v][i]].first, G[v][i], d2[G[v][i]].second});
d2[G[v][i]] = d1[G[v][i]];
d1[G[v][i]] = make_pair(cd + c[v][i], p.s);
s.insert((node) {cd + c[v][i], G[v][i], p.s});
}
}
else if (d1[G[v][i]].second != p.s && d2[G[v][i]].first > cd + c[v][i]) {
s.erase((node) {d2[G[v][i]].first, G[v][i], d2[G[v][i]].second});
d2[G[v][i]] = make_pair(cd + c[v][i], p.s);
s.insert((node) {cd + c[v][i], G[v][i], p.s});
}
}
}
}
return 0;
}
1~10WA,11AC,但是把注释处删掉会RE两个点,也就是说数据中有 u=0 或 v=0(代码中 u,v 即题目中 x,y)?