#include <bits/stdc++.h>
using namespace std;
const int N = 200005;
vector<int> v[N];
int n, kk;
int dis[N], ans[N];
void dfs1(int pos, int fa) {
  for (auto &i : v[pos])
    if (i != fa) dfs1(i, pos), dis[pos] = max(dis[pos], dis[i]);
  ++dis[pos];
}
bool dfs2(int pos, int fa, const multiset<int, greater<int>> &mt) {
  multiset<int, greater<int>> d;
  int mx = 0;
  for (auto &i : v[pos])
    if (i != fa)
      d.insert(dis[i]);
    else
      mx = 1;
  bool fs = 1;
  for (auto &i : mt) {
    if (i == dis[pos] && fs) {
      fs = 0;
      continue;
    }
    mx = i + 1;
    break;
  }
  if (mx) d.insert(mx);
  while (d.size() > 3) d.erase(prev(d.end()));
  if (d.size() > 2 && *next(d.begin()) + *next(next(d.begin())) >= kk - 1) {
    cout << "No" << endl;
    return 0;
  }
  for (auto &i : v[pos])
    if (i != fa && !dfs2(i, pos, d)) return 0;
  return 1;
}
int dep[N], f[N];
void dfs(int pos, int fa) {
  dep[pos] = dep[fa] + 1;
  f[pos] = fa;
  for (auto &i : v[pos])
    if (i != fa) dfs(i, pos);
}
void dfs3(int pos, int fa, int cur, int dd) {
  ans[pos] = cur;
  for (auto &i : v[pos])
    if (i != fa) dfs3(i, pos, (cur + dd + kk) % kk, dd);
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> kk;
  int t1, t2;
  for (int i = 1; i < n; i++) {
    cin >> t1 >> t2;
    v[t1].push_back(t2);
    v[t2].push_back(t1);
  }
  dfs1(1, 0);
  if (kk != 2 && !dfs2(1, 0, {})) return 0;
  cout << "Yes" << endl;
  if (kk == 2) {
    dfs3(1, 0, 0, 1);
    for (int i = 1; i <= n; i++) cout << ans[i] + 1 << ' ';
    return 0;
  }
  dfs(1, 0);
  t1 = max_element(dep + 1, dep + n + 1) - dep;
  dfs(t1, 0);
  t2 = max_element(dep + 1, dep + n + 1) - dep;
  vector<int> d{t2};
  while (f[t2]) d.push_back(t2 = f[t2]);
  int mid = (d.size() + 1) / 2 - 1;
  dfs3(d[mid], d[mid + 1], mid % kk, -1);
  dfs3(d[mid + 1], d[mid], (mid + 1) % kk, 1);
  for (int i = 1; i <= n; i++) cout << ans[i] + 1 << ' ';
  return 0;
}
