#include <bits/stdc++.h>
using namespace std;
template <class X, class Y>
void amax(X &x, const Y &y) {
  if (x < y) x = y;
}
template <class X, class Y>
void amin(X &x, const Y &y) {
  if (x > y) x = y;
}
const int INF = 1e9 + 10;
const long long INFL = (long long)1e18 + 10;
const int MAX = 2e5 + 10;
int n, k;
vector<int> da;
vector<int> es[MAX];
int p[MAX], cl[MAX], f[MAX];
pair<int, int> fr;
void vhandle2(int u, int p) {
  cl[u] = cl[p] ^ 1;
  for (auto v : es[u])
    if (v != p) vhandle2(v, u);
}
void handle2() {
  vhandle2(1, 0);
  for (int i = 1; i <= n; i++) cl[i]++;
  cout << "Yes" << '\n';
  for (int i = 1; i <= n; i++) cout << cl[i] << " ";
  exit(0);
}
void no() {
  cout << "No";
  exit(0);
}
void vcheck(int u, int p) {
  for (auto v : es[u])
    if (v != p) {
      vcheck(v, u);
      amax(f[u], f[v]);
    }
  f[u]++;
}
void update(vector<int> &mx, int x) {
  if (x >= mx[0]) {
    mx[2] = mx[1];
    mx[1] = mx[0];
    mx[0] = x;
  } else if (x >= mx[1]) {
    mx[2] = mx[1];
    mx[1] = x;
  } else
    amax(mx[2], x);
}
void v2check(int u, int p, int pf) {
  vector<int> mx(3, 0);
  update(mx, pf);
  for (auto v : es[u])
    if (v != p) update(mx, f[v]);
  if (mx[2] > 0 && mx[1] + mx[2] + 1 >= k) no();
  for (auto v : es[u])
    if (v != p) {
      if (f[v] == mx[0])
        v2check(v, u, mx[1] + 1);
      else
        v2check(v, u, mx[0] + 1);
    }
}
void check() {
  vcheck(1, 0);
  v2check(1, 0, 0);
}
void visit(int u, int d) {
  auto t = make_pair(d, u);
  if (t > fr) fr = t;
  for (auto v : es[u])
    if (v != p[u]) {
      p[v] = u;
      visit(v, d + 1);
    }
}
void find_diameter() {
  visit(1, 1);
  int nn = fr.second;
  p[nn] = 0;
  fr = {0, 0};
  visit(nn, 1);
  int x = fr.second;
  while (x != 0) {
    da.push_back(x);
    x = p[x];
  }
}
int longest(int u, int p) {
  int mx = 0;
  for (auto v : es[u])
    if (v != p) amax(mx, longest(v, u));
  return mx + 1;
}
void paint(int u, int p, int c, int d) {
  cl[u] = c;
  for (auto v : es[u])
    if (v != p) paint(v, u, c + d, d);
}
void process() {
  cin >> n >> k;
  for (int i = 1; i < n; i++) {
    int u, v;
    cin >> u >> v;
    es[u].push_back(v);
    es[v].push_back(u);
  }
  if (k == 2) handle2();
  check();
  cout << "Yes" << '\n';
  find_diameter();
  for (int i = 0; i < ((int)(da).size()); i++) {
    cl[da[i]] = i;
    int le = i == 0 ? -1 : da[i - 1];
    int ri = i == ((int)(da).size()) - 1 ? -1 : da[i + 1];
    int mx = 0;
    for (auto v : es[da[i]])
      if (v != le && v != ri) amax(mx, longest(v, da[i]));
    if (mx + 1 + i >= k) {
      for (auto v : es[da[i]])
        if (v != le && v != ri) paint(v, da[i], i + 1, 1);
    } else {
      for (auto v : es[da[i]])
        if (v != le && v != ri) paint(v, da[i], i - 1, -1);
    }
  }
  for (int i = 1; i <= n; i++) {
    cl[i] %= k;
    if (cl[i] < 0) cl[i] += k;
    cl[i]++;
  }
  for (int i = 1; i <= n; i++) cout << cl[i] << " ";
}
int main() {
  ios_base::sync_with_stdio(false);
  process();
}
