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

Задача . D. Покраска ребер


Вам дан ориентированный граф из \(n\) вершин и \(m\) ориентированных ребер. Гарантируется, что в нем нет ни петель, ни кратных ребер.

Определим \(k\)-покраску орграфа следующим образом: мы красим каждое ребро в один из \(k\) цветов. \(k\)-покраска является хорошей тогда и только тогда, когда в графе не существует цикла, состоящего из ребер одного цвета.

Найдите хорошую \(k\)-покраску с минимально возможным значением \(k\).

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

В первой строке заданы два целых числа \(n\) и \(m\) (\(2 \le n \le 5000\), \(1 \le m \le 5000\)) — количество вершин и ребер, соответственно.

Следующие \(m\) строк содержат описание ребер — по одному в строке. Каждое ребро задается парой целых чисел \(u\) и \(v\) (\(1 \le u, v \le n\), \(u \ne v\)) — они обозначают ребро из вершины \(u\) в вершину \(v\).

Гарантируется, что каждая упорядоченная пара \((u, v)\) входит в список ребер не более одного раза.

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

В первой строке выведите одно целое число \(k\) — количество цветов в \(k\)-покраске графа.

Во второй строке выведите \(m\) целых чисел \(c_1, c_2, \dots, c_m\) (\(1 \le c_i \le k\)), где \(c_i\) — цвет \(i\)-го ребра (ребра нумеруются в том порядке, в котором заданы во входных данных).

Если ответов несколько, выведите любой (но все равно надо минимизировать \(k\)).


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

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

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