【题目描述】
C 国中包含 n 座城市,这些城市通过 m 条双向道路连接。城市从 1 到 n 编号,道路从 1 到 m 编号,i 号道路两端连接着城市 u i 与城市 v i ,它的长度为 w i 米。经由这些道路,从 C 国中任意一个城市出发,均能到达其他所有城市。
C 国人民喜欢环路旅程,但又不喜欢经过太多条道路,为此 C 国的道路被建造得非常特殊。更具体地,对于一条经过 l 条道路的简单环路(即除起点城市外不经过重复城市的环路),它可以表示为 c 1 → c 2 → ··· → c l → c 1 (其中对于所有 1 ≤ i < l,城市c i 与城市 c i+1 有道路相连;城市 c l 与城市 c 1 有道路相连;对于所有 1 ≤ i < j ≤ l,有(c i != c j ),若 l > 3,则 C 国的道路将满足下列条件:
• 存在两个在该环路上 不相邻 的城市 u,v,满足两个城市间有道路直接相连。即:存在 1 ≤ u < v ≤ l,使得 v − u ≥ 2,u 和 v 不同时为 1 和 l,并且城市 c u 与城市 c v 间有道路直接相连。
现在 C 国有了新的翻修计划,需要在城市 s 与城市 t 间寻找一条路径进行翻修。翻修时路径中包含的所有道路将无法通行,为了保障人民的日常生活,C 国希望在翻修这条路径时,经由剩余的道路(即没被包含在翻修路径内的道路)依然能满足:从 C国中任意一个城市出发,均能到达其他所有城市。
C 国找到了身为工程大师的你,请你帮助 C 国找出一条满足上述要求的翻修路径,并使得这条路径的总长尽量小。
【输入格式】
从文件 road.in 中读入数据。
第一行两个整数 n,m 分别表示城市个数与道路条数。
接下来 m 行每行三个整数 u i ,v i ,w i ,依次表示每条道路的两个端点与它的长度。
数据保证每条道路都一定连接两个不同城市,即 u i ̸= v i 。
最后一行两个整数 s,t,分别表示需要翻修的路径的两个端点。
【输出格式】
输出到文件 road.out 中。
仅一行一个整数,表示满足题目要求的情况下,翻修路径的总长的最小值。如果不存在满足题目要求的路径,输出一行一个整数 −1。
【样例 1 输入】
4 5
1 2 1
2 3 1
3 4 1
1 3 5
2 4 6
1 4
【样例 1 输出】
6
【样例 1 解释】
路径 (1,2,1),(2,3,1),(3,4,1) 是城市 1 和城市 4 间总长最小的路径,但不符合要求。
路径 (1,3,5),(3,4,1) 符合要求,长度为 6。
路径 (1,2,1),(2,4,6) 符合要求,长度为 7。
除上述两条路径外,没有其他满足要求的路径。
【样例 2 输入】
2 1
1 2 1
1 2
【样例 2 输出】
-1
【样例 3】
见选手目录下的 road/road3.in 与 road/road3.ans。
该样例与测试点 1 ∼ 6 限制相同。
【样例 4】
见选手目录下的 road/road4.in 与 road/road4.ans。
该样例与测试点 7 ∼ 10 限制相同。
【样例 5】
见选手目录下的 road/road5.in 与 road/road5.ans。
该样例与测试点 11 ∼ 15 限制相同。
【样例 6】
见选手目录下的 road/road6.in 与 road/road6.ans。
该样例与测试点 16 ∼ 20 限制相同。
【测试点约束】
对于所有测试点:2 ≤ n ≤ 5 × 10 5 ,2 ≤ m ≤ 10 6 ,s ̸= t。
1 ≤ u i ,v i ≤ n,u i ̸= v i ,1 ≤ w i ≤ 10 9 ,保证任意两条道路它们的端点不全相同。
保证给出的道路满足题面描述第二段中的性质。
每个测试点的具体限制见下表:
测试点编号 n≤ m≤ 特殊限制
1 ∼ 6 2000 4000 无
7 ∼ 10 5×10^5 10^6 A
11 ∼ 15 5×10^5 10^6 B
16 ∼ 20 5×10^5 10^6 无
特殊限制 A:所有道路的长度均相等。
特殊限制 B:所有 w i = 1 的道路恰好构成 s 到 t 的一条路径,且其他 w i ̸= 1 的道
路的两条端点在这条路径上距离为 2。