#!/usr/bin/python3 # Autor: Jirka Setnička import sys from collections import namedtuple Hroch = namedtuple("Hroch", ["stado", "setkani"]) # 1. Načteme vstup a budeme si z hrochů stavět graf N, M = map(int, input().split()) # Vyrobíme si pole příslušnosti hrochů (zatím nic nevíme, proto None) a pole setkání # jednotlivých hrochů hrosiStado = [None for i in range(N)] setkani = [[] for i in range(N)] for i in range(M): # Načteme setkání jako čísla dvou hrochů a, b = map(int, input().split()) setkani[a].append(b) setkani[b].append(a) # 2. Budeme procházet hrochy tak, že vždy z hrocha, u kterého nemáme rozhodnuto # o stádu, spustíme prohledávání do hloubky - všichni hroši, se kterými se # potkal, by měli být ve druhém stádu a tak dále for i in range(N): # Již určené hrochy přeskočíme if hrosiStado[i] is not None: continue # Pokud jsme došli sem, tak máme zatím neurčeného hrocha a zahájíme # prohledávání do hloubky (pomocí zásobníku). Nechť je tento hroch ve stádu A. zasobnik = [(i, 'A')] while len(zasobnik) > 0: (id, stado) = zasobnik.pop() if hrosiStado[id] == stado: # Tohoto hrocha jsme již zpracovali, přeskočíme continue elif hrosiStado[id] is None: # Označíme hrocha hrosiStado[id] = stado # Zahájíme prohledávání ve všech sousedech opacneStado = 'A' if stado == 'B' else 'B' for s in setkani[id]: zasobnik.append((s, opacneStado)) else: # Nastal konflikt, vypíšeme chybu print("NEEXISTUJE") sys.exit(1) # 3. Vypíšeme jedno stádo # Vyfiltrujeme si stádo 'A stado = [str(i) for i in range(N) if hrosiStado[i] == 'A'] # Vypíšeme počet a potom na další řádek spojíme všechny print(len(stado)) print(" ".join(stado))