EduBrick

H. Конденсация целиком

3000 мс · 256 МБ · всё или ничего

Найдите компоненты сильной связности и занумеруйте их так, чтобы для каждого ребра номер компоненты начала был не больше номера компоненты конца. То есть топологически отсортируйте конденсацию.

Таких нумераций обычно много. Чтобы ответ был единственным, договоримся: нумерация — это лексикографически наименьшая топологическая сортировка конденсации, где компоненты сравниваются по наименьшей входящей в них вершине.

Иначе говоря: постройте конденсацию, сопоставьте каждой компоненте её наименьшую вершину и запустите алгоритм Кана с кучей по этому ключу.

Полезно знать и другое: алгоритм Косарайю нумерует компоненты в порядке убывания времени выхода, а это уже топологический порядок конденсации — просто не обязательно наименьший. Так что если бы условие разрешало любую нумерацию, второй шаг был бы не нужен вовсе.

Формат ввода

Первая строка содержит числа NN (1≤N≤2⋅1051 \le N \le 2 \cdot 10^5) и MM (0≤M≤2⋅1050 \le M \le 2 \cdot 10^5).

Далее идут MM строк с рёбрами. Возможны кратные рёбра и петли.

Формат вывода

В первой строке — число компонент KK.

Во второй — NN чисел: номер компоненты каждой вершины.

Примеры

ввод
10 19
1 4
7 8
5 10
8 9
9 6
2 6
6 2
3 8
9 2
7 2
9 7
4 5
3 6
7 3
6 7
10 8
10 1
2 9
2 7
вывод
2
1 2 2 1 1 2 2 2 2 1
ввод
4 2
3 4
1 2
вывод
4
1 2 3 4
Войдите, чтобы отправлять решения.