#include <bits/stdc++.h>
using namespace std;
int n, k;
int par[200005], up[200005], h[200005];
int m[200005], m1[200005], m2[200005];
int ans[200005], color[200005];
vector<int> adj[200005];
bool z = 1;
int a, b;
int diam = 0;
int check_dfs(int i, int p, int d) {
  par[i] = p;
  h[i] = d;
  m[i] = m1[i] = m2[i] = -1;
  for (auto j : adj[i])
    if (j != p) {
      int x = 1 + check_dfs(j, i, d + 1);
      if (x > m[i]) {
        m2[i] = m1[i];
        m1[i] = m[i];
        m[i] = x;
      } else if (x > m1[i]) {
        m2[i] = m1[i];
        m1[i] = x;
      } else if (x > m2[i])
        m2[i] = x;
    }
  return max(0, m[i]);
}
void check_dfs1(int i, int p, int v) {
  if (i != 1) {
    up[i] = up[p] + 1;
    up[i] = max(up[i], v + 1);
  }
  if ((((m[i] > 0) + (m1[i] > 0) + (m2[i] > 0)) == 3 && m[i] + m1[i] >= k - 1 &&
       m1[i] + m2[i] >= k - 1 && m2[i] + m[i] >= k - 1) ||
      (((m[i] > 0) + (m1[i] > 0) + (up[i] > 0)) == 3 && m[i] + m1[i] >= k - 1 &&
       m1[i] + up[i] >= k - 1 && up[i] + m[i] >= k - 1))
    z = 0;
  for (auto j : adj[i]) {
    if (j == p) continue;
    check_dfs1(j, i, ((m[j] + 1) == m[i] ? m1[i] : m[i]));
  }
}
pair<int, int> diam_dfs(int i, int p) {
  pair<int, int> m = {0, i}, M = {0, i};
  for (auto j : adj[i]) {
    if (j == p) continue;
    pair<int, int> d = diam_dfs(j, i);
    d.first++;
    if (d.first > M.first) {
      m = M;
      M = d;
    } else if (d.first > m.first)
      m = d;
  }
  if (diam < m.first + M.first) {
    diam = m.first + M.first;
    a = m.second;
    b = M.second;
  }
  return M;
}
vector<int> work() {
  vector<int> res, x;
  if (h[a] > h[b]) swap(a, b);
  while (h[b] > h[a]) {
    res.push_back(b);
    b = par[b];
  }
  while (a != b) {
    res.push_back(b);
    x.push_back(a);
    b = par[b];
    a = par[a];
  }
  res.push_back(a);
  reverse(x.begin(), x.end());
  res.insert(res.end(), x.begin(), x.end());
  return res;
}
void dfs(int i, int p, int d) {
  ans[i] = color[d];
  for (auto j : adj[i])
    if (j != p) dfs(j, i, d + 1);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int x, y;
    cin >> x >> y;
    adj[x].push_back(y);
    adj[y].push_back(x);
  }
  check_dfs(1, 1, 1);
  check_dfs1(1, 1, -1);
  if (!z && k != 2) return cout << "No" << '\n', 0;
  diam_dfs(1, 1);
  vector<int> diameter = work();
  for (int i = 0; i < diameter.size(); i++) ans[diameter[i]] = (i % k);
  for (int i = ((int)diameter.size() - 1) / 2; i >= 0; i--)
    color[((int)diameter.size() - 1) / 2 - i] = ans[diameter[i]];
  dfs(diameter[((int)diameter.size() - 1) / 2],
      diameter[((int)diameter.size() - 1) / 2 + 1], 0);
  for (int i = ((int)diameter.size() - 1) / 2 + 1; i < diameter.size(); i++)
    color[i - 1 - ((int)diameter.size() - 1) / 2] = ans[diameter[i]];
  dfs(diameter[((int)diameter.size() - 1) / 2 + 1],
      diameter[((int)diameter.size() - 1) / 2], 0);
  cout << "Yes" << '\n';
  for (int i = 1; i <= n; i++) cout << ans[i] + 1 << " ";
  cout << '\n';
  return 0;
}
