#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,popcnt,abm,mmx,tune=native")
using namespace std;
template <typename T>
void uin(T &a, T b) {
  if (b < a) {
    a = b;
  }
}
template <typename T>
void uax(T &a, T b) {
  if (b > a) {
    a = b;
  }
}
const long long N = 228228;
const long long INF = 1e9 + 228;
long long k, n;
vector<long long> g[N];
long long dist[N];
long long far(long long a) {
  for (long long i = 1; i <= n; ++i) {
    dist[i] = INF;
  }
  dist[a] = 0;
  vector<long long> q;
  q.push_back(a);
  for (long long i = 0; i < (long long)q.size(); ++i) {
    long long v = q[i];
    for (long long to : g[v]) {
      if (dist[v] + 1 < dist[to]) {
        dist[to] = dist[v] + 1;
        q.push_back(to);
      }
    }
  }
  long long mx = 0;
  for (long long i = 1; i <= n; ++i) {
    if (dist[i] > dist[mx]) {
      mx = i;
    }
  }
  return mx;
}
vector<long long> diA;
vector<long long> curv;
void dfs(long long v, long long t, long long par = -1) {
  curv.push_back(v);
  if (v == t) {
    diA = curv;
  } else {
    for (long long to : g[v]) {
      if (to != par) {
        dfs(to, t, v);
      }
    }
  }
  curv.pop_back();
}
vector<long long> find_diametr() {
  diA.clear();
  long long a = far(1);
  long long b = far(a);
  dfs(a, b);
  return diA;
}
long long nxt(long long a) {
  ++a;
  if (a > k) a = 1;
  return a;
}
long long pv(long long a) {
  --a;
  if (!a) a = k;
  return a;
}
long long color[N], deep[N];
bool blocked[N];
void jfs(long long v, long long c, long long delta, long long par = -1) {
  color[v] = c;
  for (long long to : g[v]) {
    if (to == par) continue;
    if (!blocked[to]) {
      long long nc = c;
      if (delta == 1)
        nc = nxt(c);
      else
        nc = pv(c);
      jfs(to, nc, delta, v);
    }
  }
}
map<pair<long long, long long>, long long> value;
void DFS(long long v, long long par = -1) {
  long long sz = 0;
  vector<long long> sons;
  for (long long to : g[v]) {
    if (to != par) {
      DFS(to, v);
      uax(deep[v], 1 + deep[to]);
      ++sz;
      sons.push_back(to);
    }
  }
  vector<long long> pref(sz + 1), suff(sz + 2);
  for (long long i = 1; i <= sz; ++i) {
    pref[i] = max(pref[i - 1], deep[sons[i - 1]]);
  }
  for (long long i = sz; i; --i) {
    suff[i] = max(suff[i + 1], deep[sons[i - 1]]);
  }
  for (long long i = 1; i <= sz; ++i) {
    value[{v, sons[i - 1]}] = value[{sons[i - 1], v}] =
        max(pref[i - 1], suff[i + 1]) + (sz > 1 ? 1 : 0);
  }
}
long long up[N];
void JFS(long long v, long long par = -1) {
  vector<long long> sons;
  for (long long to : g[v]) {
    if (to != par) {
      sons.push_back(to);
    }
  }
  sort(sons.begin(), sons.end(),
       [&](long long i, long long j) { return deep[i] > deep[j]; });
  if (par == -1) {
    if (sons.size() > 2) {
      long long a = deep[sons[0]], b = deep[sons[1]], c = deep[sons[2]];
      if (a + b >= k - 1 && b + c >= k - 1 && a + c >= k - 1) {
        cout << "No\n";
        exit(0);
      }
    }
  } else {
    reverse(sons.begin(), sons.end());
    uax(up[v], up[par] + 1);
    uax(up[v], 1 + value[{par, v}]);
    vector<long long> kek;
    long long it = 3;
    while (!sons.empty() && it--) {
      kek.push_back(deep[sons.back()] + 1);
      sons.pop_back();
    }
    kek.push_back(up[v]);
    sort(kek.rbegin(), kek.rend());
    if (kek.size() > 2) {
      long long a = kek[0], b = kek[1], c = kek[2];
      if (a + b >= k - 1 && b + c >= k - 1 && a + c >= k - 1) {
        cout << "No\n";
        exit(0);
      }
    }
  }
  for (long long to : g[v]) {
    if (to != par) {
      JFS(to, v);
    }
  }
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> k;
  for (long long i = 0; i < n - 1; ++i) {
    long long u, v;
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  if (k > 2) {
    DFS(1);
    JFS(1);
  }
  vector<long long> dia = find_diametr();
  for (long long i = 0; i < (long long)dia.size(); ++i) {
    color[dia[i]] = i % k + 1;
    blocked[dia[i]] = 1;
  }
  for (long long i = 0; i < (long long)dia.size() / 2; ++i) {
    for (long long to : g[dia[i]]) {
      if (!blocked[to]) {
        jfs(to, pv(color[dia[i]]), -1);
      }
    }
  }
  for (long long i = (long long)dia.size() / 2; i < (long long)dia.size();
       ++i) {
    for (long long to : g[dia[i]]) {
      if (!blocked[to]) {
        jfs(to, nxt(color[dia[i]]), 1);
      }
    }
  }
  cout << "Yes\n";
  for (long long i = 1; i <= n; ++i) {
    cout << color[i] << ' ';
  }
  cout << '\n';
  return 0;
}
