Олимпиадный тренинг

Задача . D. Удаление ребер


Задан неориентированный связный взвешенный граф, состоящий из \(n\) вершин и \(m\) ребер. Определим длину кратчайшего пути из вершины \(1\) в вершину \(i\) как \(d_i\).

Требуется удалить несколько ребер графа так, чтобы осталось не более \(k\) ребер. Назовем вершину \(i\) хорошей, если после удаления ребер все еще существует путь из \(1\) в \(i\) длины \(d_i\).

Ваша задача — удалить ребра таким образом, чтобы количество хороших вершин было максимально.

Входные данные

В первой строке записаны три целых числа \(n\), \(m\) and \(k\) (\(2 \le n \le 3 \cdot 10^5\), \(1 \le m \le 3 \cdot 10^5\), \(n - 1 \le m\), \(0 \le k \le m\)) — количество вершин и ребер в графе, а также максимальное количество ребер, которые могут остаться в графе, соответственно.

Затем следуют \(m\) строк, в каждой содержатся по три целых числа \(x\), \(y\), \(w\) (\(1 \le x, y \le n\), \(x \ne y\), \(1 \le w \le 10^9\)), задающие ребро между вершинами \(x\) и \(y\) веса \(w\).

Данный граф связный (любая вершина достижима из любой другой) и простой (не существует петель, и для каждой неупорядоченной пары вершин существует не более одного ребра, соединяющего эти вершины).

Выходные данные

В первой строке выведите \(e\) — количество ребер, которые останутся в графе (\(0 \le e \le k\)).

Во второй строке выведите \(e\) различных целых чисел от \(1\) до \(m\) — номера ребер, которые останутся в графе. Ребра пронумерованы в том же порядке, в котором задавались во входных данных. Количество хороших вершин должно быть максимально возможным.


Примеры
Входные данныеВыходные данные
1 3 3 2
1 2 1
3 2 1
1 3 3
2
1 2
2 4 5 2
4 1 8
2 4 1
2 1 3
3 4 9
3 1 5
2
3 2

time 2500 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w645
Комментарий учителя