#include <bits/stdc++.h>
template <typename T>
constexpr T my_abs(const T &x) {
  return x < 0 ? -x : x;
}
using ll = long long;
constexpr int MOD = 1e9 + 7;
inline int quick_pow(int a, int n) {
  int res = 1;
  while (n) {
    if (n & 1) res = (ll)res * a % MOD;
    a = (ll)a * a % MOD;
    n >>= 1;
  }
  return res;
}
int que[200005], dis[200005], pre[200005];
int seq[200005], ans[200005], mxd[200005], n, k;
bool chose[200005];
std::vector<int> adj[200005];
int bfs(int st) {
  memset(dis, 0x3f, sizeof(dis));
  int he = 0, ta = 0;
  que[ta++] = st;
  dis[st] = 0;
  while (he < ta) {
    int u = que[he++];
    for (int v : adj[u]) {
      if (dis[v] > dis[u] + 1) {
        dis[v] = dis[u] + 1;
        pre[v] = u;
        que[ta++] = v;
      }
    }
  }
  return std::max_element(dis, dis + n) - dis;
}
void dfs(int u, int fa = -1) {
  mxd[u] = 0;
  for (int v : adj[u]) {
    if (v == fa || chose[v]) continue;
    dfs(v, u);
    mxd[u] = std::max(mxd[u], mxd[v] + 1);
  }
}
void go(int u, int t, int fa = -1) {
  for (int v : adj[u]) {
    if (v == fa || chose[v]) continue;
    ans[v] = (ans[u] + t + k) % k;
    go(v, t, u);
  }
}
int main() {
  scanf("%d%d", &n, &k);
  for (int i = 1; i < n; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    adj[--u].push_back(--v);
    adj[v].push_back(u);
  }
  int st = bfs(0), en = bfs(st), len = 0;
  for (int i = en; i != st; i = pre[i]) seq[len++] = i;
  seq[len++] = st;
  if (k == 2) {
    puts("Yes");
    for (int i = 0; i < n; i++)
      printf("%d%c", dis[i] % 2 + 1, " \n"[i + 1 == n]);
    return 0;
  }
  for (int i = 0; i < len; i++) chose[seq[i]] = true;
  for (int i = 0; i < len; i++) {
    int u = seq[i];
    ans[u] = i % k;
    dfs(u);
    if (!mxd[u]) continue;
    if (mxd[u] + i + 1 >= k && mxd[u] + len - i >= k) {
      puts("No");
      return 0;
    }
    if (mxd[u] + len - i >= k)
      go(u, -1);
    else
      go(u, 1);
  }
  puts("Yes");
  for (int i = 0; i < n; i++) printf("%d%c", ans[i] + 1, " \n"[i + 1 == n]);
  return 0;
}
