#include <bits/stdc++.h>
using namespace std;
const long long maxn = 4e5 + 7;
long long n, k, up[maxn], ans;
vector<long long> q[maxn];
map<long long, long long> t[maxn];
vector<pair<long long, long long> > edges;
void dfs(long long v, long long p) {
  long long cnt = 0;
  for (auto i : q[v]) {
    if (i != p) {
      cnt++;
      if (cnt == up[v]) cnt++;
      up[i] = cnt;
    }
  }
  for (auto i : q[v]) {
    if (i != p) {
      dfs(i, v);
    }
  }
}
void calc(long long v, long long p, long long mc) {
  set<long long> st;
  st.insert(min(mc, up[v]));
  for (auto i : q[v]) {
    if (i != p) {
      long long prev = st.size();
      st.insert(min(mc, up[i]));
      if (st.size() == prev) {
        ans++;
        break;
      }
    }
  }
  st.clear();
  for (auto i : q[v]) {
    if (i != p) {
      calc(i, v, mc);
    }
  }
}
void make(long long v, long long p, long long mc) {
  for (auto i : q[v]) {
    if (i != p) {
      t[i][v] = min(mc, up[i]);
      t[v][i] = min(mc, up[i]);
    }
  }
  for (auto i : q[v]) {
    if (i != p) {
      make(i, v, mc);
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> n >> k;
  for (long long i = 1; i <= n - 1; i++) {
    long long x, y;
    cin >> x >> y;
    q[x].push_back(y);
    q[y].push_back(x);
    edges.push_back(make_pair(x, y));
  }
  up[1] = 0;
  dfs(1, 1);
  long long l = 1, r = n - 1;
  for (long long i = 0; i < 20; i++) {
    ans = 0;
    long long mid = ((l + r) >> 1LL);
    calc(1, 1, mid);
    if (ans > k)
      l = mid;
    else
      r = mid;
  }
  cout << r << endl;
  make(1, 1, r);
  for (auto i : edges) {
    cout << t[i.first][i.second] << " ";
  }
}
