异世界
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
64bit IO Format: %lld

题目描述

讨厌鬼开发了一款异世界游戏,异世界包含 n 个据点,据点和据点之间拥有 m 条可修建传送阵,所有传送阵可以一起修建。也就是说,当你需要修建多个传送阵时,修建的时间为所有传送阵之中的最大修建时间。传送阵可以连接两个据点并在一秒时间里将勇者从一个据点传送到另一个据点。


在决定完修建哪些传送阵且修建之后, k 名勇者将被传送至各自的据点,第 i 名勇者的据点为 ,宝藏将被埋在 x 据点。游戏开始后,每个勇者同时将以最优策略往宝藏走。有一个勇者获得宝藏之后,游戏结束。

讨厌鬼没有耐心不想等太长时间,他希望在保证勇者不破坏勇者拿到宝藏的最短步数的情况下的修建传送阵的时长最短。请你帮助讨厌鬼计算勇者拿到宝藏的最短步数以及在这个前提下修建传送阵的最短时间,输出他们的和。


输入描述:

第一行三个整数 ,表示有 n 个据点, k 名勇者,和宝藏所在的 x 据点。

第二行  个用空格隔开的整数 a_i ,第 i 个整数表示第 i 个勇者所在的据点。

第三行一个整数 ,表示共有 m 条可修建传送阵。

接下来  行,每行三个整数 ,第 i 行表示第 i 个传送阵连接 u,v 据点且修建时间为 w 。

输出描述:

一行一个整数,表示花费的最少时间,若没有勇者可以拿到宝藏,则输出 -1 。
示例1

输入

复制
3 1 3
1
2
1 2 1
2 3 2

输出

复制
4

说明

修建第1,2条传送阵,共耗费时间2,最近的勇者1从1出发,1->2,2->3,耗时2,共耗费4的时间
示例2

输入

复制
3 1 3
1
1
1 2 1

输出

复制
-1