from collections import defaultdict import sys sys.setrecursionlimit(10 ** 8) N, M = map(int, input().split()) G = [set() for _ in range(N)] edges = [] for _ in range(M): u, v = map(int, input().split()) u -= 1 v -= 1 edges.append((u, v)) G[u].add(v) G[v].add(u) def check(i): if len(G[i]) != 3: return False x, y, z = G[i] return x in G[y] and y in G[z] and z in G[x] used = [False] * N ok = set(filter(check, range(N))) child = defaultdict(list) while ok: i = ok.pop() used[i] = True idx = sorted(G[i]) for x in idx: if check(x): ok.remove(x) for x in idx: G[x].remove(i) if check(x): ok.add(x) G[i].clear() k = tuple(idx) child[k].append(i) cur = tuple(sorted(filter(lambda i: not used[i], range(N)))) assert len(cur) == 3 color = [-1] * N color[cur[0]] = 1 color[cur[1]] = 2 color[cur[2]] = 3 def dfs(cur): x, y, z = cur c = 10 - sum(color[k] for k in cur) for i in child[cur]: color[i] = c dfs(tuple(sorted((x, y, i)))) dfs(tuple(sorted((y, z, i)))) dfs(tuple(sorted((z, y, i)))) dfs(cur) assert all(1 <= c <= 4 for c in color) assert all(color[u] != color[v] for u, v in edges) print("Yes") print(*color)