#include <bits/stdc++.h>
const int N = 2e5 + 5;
std::vector<int> g[N];
int n, k, down[N][3], up[N];
void upd(int a[3], int b) {
  for (int j = 0; j < 3; j++) {
    if (a[j] < b) {
      for (int k = 2; k > j; k--) a[k] = a[k - 1];
      a[j] = b;
      break;
    }
  }
}
void dfs1(int u, int fa, bool &ok) {
  for (int v : g[u])
    if (v != fa) {
      dfs1(v, u, ok);
      upd(down[u], down[v][0] + 1);
    }
  if (!down[u][0]) down[u][0] = 1;
  if (down[u][1] > 1 && down[u][2] > 1 && down[u][1] + down[u][2] >= k + 1 &&
      k > 2)
    ok = false;
}
void dfs2(int u, int fa, bool &ok) {
  for (int v : g[u])
    if (v != fa) {
      int d = down[v][0] + 1;
      up[v] = std::max(up[u], (d == down[u][0] ? down[u][1] : down[u][0])) + 1;
      dfs2(v, u, ok);
    }
  upd(down[u], up[u]);
  if (down[u][1] > 1 && down[u][2] > 1 && down[u][1] + down[u][2] >= k + 1 &&
      k > 2)
    ok = false;
}
int ans[N], par[N], dis[N];
bool vis[N];
std::vector<int> path;
void dfs(int u, int fa, int d) {
  dis[u] = d;
  par[u] = fa;
  for (int v : g[u])
    if (v != fa) dfs(v, u, d + 1);
}
void color(int u, int fa, int c, int d) {
  ans[u] = c;
  for (int v : g[u])
    if (v != fa && !vis[v]) {
      color(v, u, (c + d + k) % k, d);
    }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int u, v, i = 1; i < n; i++) {
    scanf("%d%d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  bool ok = true;
  dfs1(1, 0, ok);
  up[1] = 1;
  dfs2(1, 0, ok);
  if (!ok) return !printf("No");
  printf("Yes\n");
  dfs(1, 0, 0);
  int L = 1, R;
  for (int i = 2; i <= n; i++)
    if (dis[i] > dis[L]) L = i;
  R = 1;
  dfs(L, 0, 0);
  for (int i = 2; i <= n; i++)
    if (dis[i] > dis[R]) R = i;
  while (R) {
    path.push_back(R);
    vis[R] = true;
    R = par[R];
  }
  int mid = path.size() / 2;
  for (int i = 0; i < path.size(); i++) {
    color(path[i], 0, i % k, i < mid ? -1 : 1);
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i] + 1);
  return 0;
}
