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 = [v for k,v in connected.items()] S =len(size) dp = [[10**10 for j in range(S)] for i in range(N+1)] # dp[0][0]=0 for i in range(S): dp[0][i] = 0 for i in range(S): dp[size[i]][i] = 0 for i in range(1,S): for j in range(N+1): dp[j][i] = min(dp[j][i], dp[j][i-1]) for i in range(1,S): for j in range(size[i], N+1): dp[j][i] = min(dp[j][i], dp[j][i-1], dp[j-size[i]][i-1]+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)