캘빈볼 팀 나누기
시간 제한1초메모리 제한256 MB
서로 싫어하는 선수가 같은 팀에 들지 않게 최대 16명을 가장 적은 팀으로 나누고 배정 번호열이 사전 순으로 가장 작은 분할을 출력합니다.
문제
올해도 캘빈볼 선수권 대회가 열린다. 캘빈볼 한 경기에는 이름이 서로 다른 선수 명이 참가하고, 선수를 비어 있지 않은 팀 몇 개로 나눠서 진행한다. 선수 중에는 서로 싫어하는 사이가 있다. 싫어하는 사이는 대칭이다. 선수 가 선수 를 싫어하면 도 를 싫어한다.
국제 캘빈볼 무질서 협회는 대회 직전에 팀 편성 규칙을 바꿨다. 서로 싫어하는 두 선수는 같은 팀에 들어갈 수 없고, 이 조건을 지키면서 팀의 개수를 최소로 만들어야 한다.
예를 들어 캘빈(1번), 홉스(2번), 수지(3번), 톰(4번), 제리(5번), 배트맨(6번)이 경기에 참가하고, 배트맨은 나머지 다섯 명을 모두 싫어하며 톰은 제리와 홉스를 싫어한다고 하자. 배트맨과 톰과 제리는 셋이 서로 싫어하니 모두 다른 팀에 들어가야 하고, 그래서 두 팀으로는 나눌 수 없다. 세 팀으로는 나눌 수 있다. 캘빈과 홉스와 수지와 제리가 한 팀, 톰 혼자 한 팀, 배트맨 혼자 한 팀이면 규칙을 지킨다. 네 팀은 답이 아니다. 더 적은 개수로 나눌 수 있기 때문이다.
누가 누구를 싫어하는지 주어질 때, 팀의 개수가 최소인 편성을 구하는 프로그램을 작성하시오. 그런 편성이 여러 가지면 아래 출력 규칙이 정하는 하나를 출력한다.
입력
첫째 줄에 선수의 수 과 서로 싫어하는 선수 쌍의 개수 이 주어진다. (, ) 선수는 번부터 번까지 번호가 매겨져 있다.
다음 개 줄에는 서로 싫어하는 두 선수의 번호 와 가 주어진다. (, ) 같은 쌍이 두 번 주어지는 일은 없다. 순서만 다른 두 줄도 같은 쌍으로 친다.
출력
첫째 줄에 팀의 최소 개수 를 출력한다. 다음 개 줄에는 각 팀에 속한 선수의 번호를 공백으로 구분해 출력한다.
각 팀의 선수 번호는 증가하는 순서로 출력하고, 팀은 그 팀에서 가장 작은 선수 번호가 작은 것부터 출력한다. 팀 개수가 최소인 편성이 여러 가지면 다음 규칙으로 하나를 고른다. 출력하는 순서대로 팀에 번부터 번까지 번호를 붙이고, 선수 가 속한 팀의 번호를 라고 하자. 수열 이 사전순으로 가장 앞서는 편성을 출력한다.
이면 첫째 줄에 만 출력한다.