class UnionFind: def __init__(self, size): # 負の値はルート (集合の代表) で集合の個数 # 正の値は次の要素を表す self.table = [-1 for _ in range(size)] def find(self, x): # 集合の代表を求める while self.table[x] >= 0: x = self.table[x] return x def union(self, x, y): # 併合 s1 = self.find(x) s2 = self.find(y) if s1 != s2: if self.table[s1] >= self.table[s2]: self.table[s1] += self.table[s2] self.table[s2] = s1 else: self.table[s2] += self.table[s1] self.table[s1] = s2 return self.table[s1] N, M = map(int, input().split()) uf = UnionFind(N) for i in range(M): u, v = map(int, input().split()) uf.union(u - 1, v - 1) connected = {} for i in range(N): g = uf.find(i) if g in connected: connected[g] += 1 else: connected[g] = 1 size = [0]+[v for k, v in connected.items()]+[0] S = len(size) dp = [[10**10 for j in range(S+1)] for i in range(N + 1)] for i in range(S): dp[size[i]][i] = 0 for i in range(1, S): for j in range(size[i], N + 1): # print(i,j,dp[j],dp[j - size[i]][i - 1] + 1) dp[j][i] = min(dp[j][i],dp[j][i-1], dp[j - size[i]][i - 1] + 1) # dp[j][i+1] = min(dp[j][i], dp[j][i+1]) for i in range(1, N + 1): if min(dp[i]) == 10**10: print(-1) else: print(min(dp[i])) # for x in dp: # print(x)