小美的修路
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

地图上有n个城市,小美准备修建一些道路,使得任意两个城市之间都能通过道路到达。现在给定一些修路的计划(有一些计划是必选的),请你帮小美规划出最优的方案。

输入描述:

第一行输入两个正整数n,m,用空格隔开。代表城市数量。
接下来的m行,每行输入四个正整数u,v,w,p,代表一个计划是在城市u和城市v之间修建一条道路,花费为w。如果p为 1,代表该计划必选。如果p为 0,代表该计划是可选的。

1\leq n,m \leq 10^5
1\leq u,v \leq n
1\leq w \leq 10^9
0\leq p \leq 1

输出描述:

如果无解(即无法使得任意两个城市之间都能通过道路到达),则输出 -1。
如果有解,则第一行输入一个正整数k,代表选择的计划数量。第二行输入k个正整数b_i,代表选择的计划。
你只需要保证最终所有的城市都可以通过道路连通,且总代价最小即可。请注意,p=1的计划是必选的,如果你的方案不包含某个p=1的计划,则会直接返回答案错误。
示例1

输入

复制
3 4
1 2 3 1
1 2 2 0
1 3 1 0
2 3 3 0

输出

复制
2
1 3

说明

选择第一个和第三个方案,总花费为 4。