设 $S$ 为 $n$ 条线段的集合。每条线段的一个端点位于平面上的 $x$ 轴上,另一个端点位于 $x$ 轴上方。所有端点各不相同,但线段在内部可能会相交。我们希望绘制一个简单多边形 $P$,使得 $S$ 中的每一条线段都是 $P$ 边界的一部分,即 $P$ 的一条边或边的一部分。如果多边形 $P$ 的每个顶点的内角都不为 $180^\circ$,且除了相邻边在顶点处相交外,没有两条边相交,则称该多边形为简单多边形。
例如,图 H.1 展示了可以绘制简单多边形的线段示例。图中,黑色实线段代表给定集合 $S$ 中的线段。结合红色虚线段,构成了一个简单多边形。该图左侧是一个简单多边形,使得 $S$ 的所有端点都成为 $P$ 的顶点。右侧展示了一个仅有 6 个顶点的简单多边形;其中两个端点分别位于两条边的内部。请注意,集合 $S$ 中线段的端点不一定必须是为 $S$ 绘制的简单多边形的顶点。
图 H.1:可以绘制简单多边形的线段示例。
另一方面,图 X.2 展示了无法绘制任何简单多边形的线段示例。
图 X.2:无法绘制任何简单多边形的线段示例。
对于一组线段,可能存在多个简单多边形。在这种情况下,我们希望找到一个边界长度最小的简单多边形。例如,图 H.3 中所示简单多边形的边界长度小于该集合的其他任何简单多边形。
图 H.3:边界长度最小的简单多边形。
给定一组线段,编写一个程序来确定是否存在该集合的简单多边形,如果存在,则找到边界长度最小的简单多边形。
输入格式
程序从标准输入读取数据。输入的第一行包含一个整数 $n$ ($3 \le n \le 20,000$),表示线段的数量。接下来的 $n$ 行,每行包含三个整数 $x_1, x_2$ 和 $y_2$ ($1 \le x_1, x_2, y_2 \le 10^6$),分别代表线段的两个端点 $(x_1, 0)$ 和 $(x_2, y_2)$。注意,所有线段的端点都是不同的,即没有任何两个端点位于相同的位置。
输出格式
程序输出到标准输出。仅打印一行。如果给定线段集合存在简单多边形,则输出一个保留一位小数的实数,表示边界长度最小的简单多边形的边界长度;否则输出 -1。
样例
样例输入 1
4 1 1 2 2 2 1 3 3 1 4 4 2
样例输出 1
12.0
样例输入 2
4 1 1 2 2 3 2 5 4 1 7 1 4
样例输出 2
19.3
样例输入 3
4 5 6 6 4 3 2 1 3 4 9 7 3
样例输出 3
-1