Rt.Thks.
code:
#include <iostream>
#include <queue>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int n, m, s, lnsz, head[500010], size_hr[500010], size_rn[500010], size_dr[500010];
int cg[500010];
struct cmp_hr
{
bool operator()(int a, int b) const
{
return size_hr[a] > size_hr[b];
}
};
struct cmp_rn
{
bool operator()(int a, int b) const
{
return size_rn[a] > size_rn[b];
}
};
struct cmp_dr
{
bool operator()(int a, int b) const
{
return size_dr[a] > size_dr[b];
}
};
priority_queue<int, vector<int>, cmp_hr> q_hr;
priority_queue<int, vector<int>, cmp_rn> q_rn;
priority_queue<int, vector<int>, cmp_rn> q_dr;
int goed[500010];
struct ln
{
int u, v, sz, nxt;
} a[1000010];
inline void mrg(int u, int v, int sz)
{
a[++lnsz].u = u;
a[lnsz].v = v;
a[lnsz].sz = sz;
a[lnsz].nxt = head[u];
head[u] = lnsz;
}
inline void dij(int start, int qq)
{
q_hr.push(start);
q_rn.push(start);
q_dr.push(qq);
size_hr[start] = 0;
size_rn[start] = 0;
size_dr[qq] = 0;
register int t, v;
while (!q_hr.empty())
{
t = q_hr.top();
q_hr.pop();
goed[t] = false;
for (register int i = head[t]; i; i = a[i].nxt)
{
v = a[i].v;
if (size_hr[v] > size_hr[t] + a[i].sz)
{
size_hr[v] = size_hr[t] + a[i].sz;
if (!goed[v])
{
goed[v] = true;
q_hr.push(v);
}
}
}
}
while (!q_rn.empty())
{
t = q_rn.top();
q_rn.pop();
goed[t] = false;
for (register int i = head[t]; i; i = a[i].nxt)
{
v = a[i].v;
if (!cg[v])
continue;
if (size_rn[v] > size_rn[t] + a[i].sz)
{
size_rn[v] = size_rn[t] + a[i].sz;
if (!goed[v])
{
goed[v] = true;
q_rn.push(v);
}
}
}
}
while (!q_dr.empty())
{
t = q_dr.top();
q_dr.pop();
goed[t] = false;
for (register int i = head[t]; i; i = a[i].nxt)
{
v = a[i].v;
if (size_dr[v] > size_dr[t] + a[i].sz)
{
size_dr[v] = size_dr[t] + a[i].sz;
if (!goed[v])
{
goed[v] = true;
q_dr.push(v);
}
}
}
}
}
inline void print(int k)
{
char ch[20];
int num = 0;
while (k > 0)
ch[++num] = k % 10, k /= 10;
while (num)
putchar(ch[num--] + 48);
putchar(32);
}
signed main()
{
int u, v, w, k;
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
n = read();
m = read();
k = read();
s = 1;
memset(cg, true, sizeof(cg));
for (int i = 0; i < k; ++i)
cg[(read())] = false;
for (register int i = 0; i < m; ++i)
{
(u = read()), (v = read()), (w = read());
mrg(u, v, w);
mrg(v, u, w);
}
for (register int i = 0; i <= n; ++i)
size_hr[i] = size_rn[i] = size_dr[i] = INF;
int x, y;
x = read();
y = read();
dij(s, x);
print(min(min(max(size_hr[x], size_rn[y]), max(size_rn[x], size_hr[y])), min(size_hr[x], size_hr[y]) + size_dr[y]));
puts("");
return 0;
}