#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
vector<int> e[maxn];
vector<int> chs[maxn];
bool used[maxn];
int ld[maxn], lu[maxn];
int h[maxn];
void dfs0(int v) {
  used[v] = true;
  ld[v] = 0;
  for (int u : e[v]) {
    if (!used[u]) {
      h[u] = h[v] + 1;
      dfs0(u);
      ld[v] = max(ld[v], ld[u] + 1);
      chs[v].push_back(u);
    }
  }
}
void dfs1(int v) {
  int m1 = -5, m2 = -5;
  for (int u : chs[v]) {
    if (ld[u] + 1 >= m1) {
      m2 = m1;
      m1 = ld[u];
    } else if (ld[u] + 1 >= m2) {
      m2 = ld[u];
    }
  }
  for (int u : chs[v]) {
    if (m1 != ld[u])
      lu[u] = max(lu[v] + 1, m1 + 2);
    else
      lu[u] = max(lu[v] + 1, m2 + 2);
    dfs1(u);
  }
}
void dfs2(int v) {
  used[v] = true;
  for (int u : e[v]) {
    if (!used[u]) {
      h[u] = h[v] + 1;
      dfs2(u);
      chs[v].push_back(u);
    }
  }
}
vector<int> tv;
bool onto[maxn];
void dfs3(int v) {
  for (int u : chs[v]) {
    dfs3(u);
    onto[v] |= onto[u];
  }
}
int gett(int v, int t) {
  if (t == 0) return v;
  for (int u : chs[v]) {
    if (onto[u]) return gett(u, t - 1);
  }
}
int res[maxn];
void dfsst1(int v, int cur, int k) {
  res[v] = cur;
  cur = (cur + 1) % k;
  used[v] = true;
  for (int u : e[v]) {
    if (!used[u]) {
      dfsst1(u, cur, k);
    }
  }
}
void dfsst2(int v, int cur, int k) {
  res[v] = cur;
  cur = (cur - 1 + k) % k;
  used[v] = true;
  for (int u : e[v]) {
    if (!used[u]) {
      dfsst2(u, cur, k);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  int n, k;
  cin >> n >> k;
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    cin >> u >> v;
    e[u].push_back(v);
    e[v].push_back(u);
  }
  dfs0(1);
  dfs1(1);
  if (k == 2) {
    fill(used, used + n + 1, false);
    dfsst1(1, 0, 2);
    cout << "Yes\n";
    for (int i = 1; i <= n; i++) {
      cout << res[i] + 1 << " ";
    }
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    tv.clear();
    if (i != 1) tv.push_back(lu[i]);
    for (int u : chs[i]) {
      tv.push_back(ld[u] + 1);
    }
    sort(tv.begin(), tv.end(), greater<int>());
    if (tv.size() >= 3 && tv[1] + tv[2] >= k - 1) {
      cout << "No";
      return 0;
    }
  }
  cout << "Yes\n";
  int st = 1;
  for (int i = 1; i <= n; i++) {
    if (h[i] > h[st]) st = i;
  }
  fill(used, used + n + 1, false);
  h[st] = 0;
  for (int i = 1; i <= n; i++) {
    chs[i].clear();
  }
  dfs2(st);
  int fin = st;
  for (int i = 1; i <= n; i++) {
    if (h[i] > h[fin]) fin = i;
  }
  onto[fin] = true;
  dfs3(st);
  int x = gett(st, (h[fin] + 1) / 2 - 1);
  int y = gett(st, (h[fin] + 1) / 2);
  fill(used, used + n + 1, false);
  used[y] = true;
  dfsst1(x, 0, k);
  fill(used, used + n + 1, false);
  used[x] = true;
  dfsst2(y, k - 1, k);
  for (int i = 1; i <= n; i++) {
    cout << res[i] + 1 << " ";
  }
  return 0;
}
