from collections import deque from random import randint INF = 10**18 N, M = [int(s) for s in input().split()] graph = [[] for _ in range(N)] for _ in range(M): u, v = [int(s) - 1 for s in input().split()] graph[u].append(v) graph[v].append(u) x = randint(0, N - 1) def bfs(start): dist = [INF] * N dist[start] = 0 que = deque([start]) while que: v = que.popleft() for to in graph[v]: if dist[to] < INF: continue dist[to] = dist[v] + 1 que.append(to) return dist dist = bfs(x) g = [] for v in range(N): if dist[v] == 1: g.append(v) y = g[0] z = None for _z in g[1:]: if _z in graph[y]: z = _z break dist_x = bfs(x) dist_y = bfs(y) dist_z = bfs(z) max_dist = [max(dist_x[i], dist_y[i], dist_z[i]) for i in range(N)] group = [[] for _ in range(N)] for i in range(N): if i in (x, y, z): continue group[max_dist[i]].append(i) answers = [None] * N answers[x] = 1 answers[y] = 2 answers[z] = 3 for d in range(N): for v in group[d]: s = {1, 2, 3, 4} for to in graph[v]: if answers[to] is None: continue s.discard(answers[to]) answers[v] = s.pop() print("Yes") print(*answers)