图:基于欧几里得度量由 20 个点制作的沃罗诺伊图。来源:维基百科
在笛卡尔坐标系中,我们定义大小为 $n$ 的非空点集的沃罗诺伊图(Voronoi Diagram)为根据“该位置离集合中的哪个点最近?”这一标准来划分平面的图。例如,在上图中,平面上的每个位置都根据距离该位置最近的黑色点进行了染色。存在一种可以在 $O(n \log n)$ 时间内计算沃罗诺伊图的算法,但该算法因极其复杂和困难而闻名。
在一次重要比赛中未能解决一道关于沃罗诺伊图的题目后,Minkyu 受到了极大的打击,开始每天借酒消愁!一个晴朗的下午,Minkyu 像往常一样喝着啤酒,突然发现了一种解决沃罗诺伊图的巧妙算法!在为此撰写论文之前,Minkyu 想出一道需要该算法的题目,以防止 2018 KAIST RUN Spring Contest 中出现满分获得者。
为什么 Minkyu 的沃罗诺伊图算法如此伟大?传统的沃罗诺伊图算法仅适用于笛卡尔坐标系,而 Minkyu 的算法适用于更广义的结构——“图”。考虑一个具有 $N$ 个顶点和 $M$ 条带正权重的边的连通图。当给你一个大小为 $K$ 的非空顶点子集时,该点集的“沃罗诺伊图”根据“该位置离集合中的哪个顶点最近?”这一标准来划分边上的所有位置。如果存在多个距离相等的点,则认为顶点编号最小的那个更近。
给你一个带权连通图和一个大小为 $K$ 的非空顶点子集。对于子集中的每个顶点,你应该计算以该顶点为“最近顶点”的边段总长度。解决这个问题,并比 Minkyu 更快地写出论文,来粉碎他的幻想吧!
输入格式
第一行包含两个空格分隔的整数,分别表示顶点数 $N$ 和边数 $M$。($1 \le N, M \le 250\,000$)
接下来的 $M$ 行中,每行包含三个空格分隔的整数,分别表示第 $i$ 条边的两个端点 $s_i$、$e_i$ 以及第 $i$ 条边的权重 $w_i$。($1 \le s_i, e_i \le N, 1 \le w_i \le 10^9$)
下一行包含一个整数,表示顶点子集的大小 $K$。($1 \le K \le N$)
下一行包含 $K$ 个按升序排列的互不相同的整数 $a_i$。每个整数表示子集中的顶点编号。($1 \le a_i \le N$)
你可以假设给定的图是连通的。换句话说,从任意顶点到其他任意顶点都存在一条路径。
输出格式
输出 $K$ 行,每行一个浮点数。第 $i$ 行输出以顶点 $a_i$ 为最近顶点的边段总长度。
所有输出的数字都应精确四舍五入到小数点后一位(详见样例输入/输出)。根据近期 ACM-ICPC 世界总决赛的趋势(需要高精度的浮点数处理),不允许有任何精度误差。
样例
输入样例 1
3 3 1 2 5 2 3 5 3 1 5 2 1 2
输出样例 1
7.5 7.5
输入样例 2
5 4 1 2 10 2 4 20 3 4 30 4 5 50 2 1 3
输出样例 2
80.0 30.0
输入样例 3
11 10 1 2 1000000000 1 3 1000000000 1 4 1000000000 1 5 1000000000 1 6 1000000000 1 7 1000000000 1 8 1000000000 1 9 1000000000 1 10 1000000000 1 11 1000000000 1 1
输出样例 3
10000000000.0
说明
这些是与每个样例测试相对应的示意图。