class UnionFind: def __init__(self, n): self.node = [-1 for _ in range(n)] def root(self, v): if self.node[v] < 0: return v st = [] while self.node[v] >= 0: st.append(v) v = self.node[v] for u in st: self.node[u] = v return v def size(self, v): v = self.root(v) return (- self.node[v]) def same(self, u, v): return self.root(u) == self.root(v) def unite(self, u, v): u = self.root(u) v = self.root(v) if u == v: return if self.size(u) < self.size(v): u, v = v, u elif self.size(u) == self.size(v) and u > v: u, v = v, u self.node[u] += self.node[v] self.node[v] = u n, m = map(int, input().split()) uf = UnionFind(n) for _ in range(m): a, b = map(int, input().split()) a -= 1 b -= 1 if not uf.same(a, b): uf.unite(a, b) for v in range(n): r = uf.root(v) print(r + 1)