rt,WA on #7,#9,#10,蒟蒻求调QWQ!
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node {
int to,dis;
};
vector<node>ve[50005],spve[50005];
int n,m,k,x,y,visit[50005],issp[50005],dis1[50005],dis2[50005],dis3[50005];
queue<int>q;
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
for(int i = 1; i<=k; i++) {
int u;
cin>>u;
issp[u]++;
}
for(int i = 1; i<=m; i++) {
int u,v,w;
cin>>u>>v>>w;
if(issp[u] || issp[v]) {
spve[u].push_back({v,w});
spve[v].push_back({v,w});
} else {
ve[u].push_back({v,w});
ve[v].push_back({u,w});
}
}
cin>>x>>y;
memset(dis1,0x3f,sizeof(dis1));//看哈利到所有房间的最短路
dis1[1] = 0;
q.push(1);
while(!q.empty()) {
int h;
h = q.front();
q.pop();
visit[h] = 0;
int l;
l = ve[h].size();
for(int i = 0; i<l; i++) {
if(dis1[ve[h][i].to]>dis1[h]+ve[h][i].dis) {
dis1[ve[h][i].to] = dis1[h]+ve[h][i].dis;
if(!visit[ve[h][i].to]) {
visit[ve[h][i].to]++;
q.push(ve[h][i].to);
}
}
}
l = spve[h].size();
for(int i = 0; i<l; i++) {
if(dis1[spve[h][i].to]>dis1[h]+spve[h][i].dis) {
dis1[spve[h][i].to] = dis1[h]+spve[h][i].dis;
if(!visit[spve[h][i].to]) {
visit[spve[h][i].to]++;
q.push(spve[h][i].to);
}
}
}
}
memset(dis2,0x3f,sizeof(dis2));//看罗恩到所有房间的最短路
dis2[1] = 0;
q.push(1);
while(!q.empty()) {
int h;
h = q.front();
q.pop();
visit[h] = 0;
int l;
l = ve[h].size();
for(int i = 0; i<l; i++) {
if(dis2[ve[h][i].to]>dis2[h]+ve[h][i].dis) {
dis2[ve[h][i].to] = dis2[h]+ve[h][i].dis;
if(!visit[ve[h][i].to]) {
visit[ve[h][i].to]++;
q.push(ve[h][i].to);
}
}
}
}
memset(dis3,0x3f,sizeof(dis3));
dis3[x] = 0;
q.push(x);
while(!q.empty()) {
int h;
h = q.front();
q.pop();
visit[h] = 0;
int l;
l = ve[h].size();
for(int i = 0; i<l; i++) {
if(dis3[ve[h][i].to]>dis3[h]+ve[h][i].dis) {
dis3[ve[h][i].to] = dis3[h]+ve[h][i].dis;
if(!visit[ve[h][i].to]) {
visit[ve[h][i].to]++;
q.push(ve[h][i].to);
}
}
}
l = spve[h].size();
for(int i = 0; i<l; i++) {
if(dis3[spve[h][i].to]>dis3[h]+spve[h][i].dis) {
dis3[spve[h][i].to] = dis3[h]+spve[h][i].dis;
if(!visit[spve[h][i].to]) {
visit[spve[h][i].to]++;
q.push(spve[h][i].to);
}
}
}
}
cout<<min(min(dis1[x],dis1[y])+dis3[y],min(max(dis1[x],dis2[y]),max(dis2[x],dis1[y])))<<"\n";
return 0;
}