#include <bits/stdc++.h>
using namespace std;
const long long N = 200005;
vector<long long> v[N];
map<pair<long long, long long>, long long> mp;
long long r, k;
long long a[N];
bool vis[N];
long long ans[N];
void dfs(long long node, long long num) {
  if (vis[node]) return;
  vis[node] = 1;
  long long c = 1;
  if (a[node] > r) {
    if (num == -1) num = 1;
    for (auto it : v[node]) {
      if (vis[it]) continue;
      ans[mp[{min(it, node), max(it, node)}]] = num;
      dfs(it, num);
    }
  } else {
    for (auto it : v[node]) {
      if (vis[it]) continue;
      if (c == num) {
        c++;
      }
      ans[mp[{min(it, node), max(it, node)}]] = c;
      dfs(it, c);
      c++;
    }
  }
}
int32_t main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  long long n;
  cin >> n >> k;
  for (long long i = 0; i < n - 1; i++) {
    long long x, y;
    cin >> x >> y;
    x--;
    y--;
    v[x].push_back(y);
    v[y].push_back(x);
    if (x > y) swap(x, y);
    mp[{x, y}] = i;
    a[x]++;
    a[y]++;
  }
  long long temp[n];
  for (long long i = 0; i < n; i++) temp[i] = a[i];
  sort(a, a + n);
  long long lo = 1, hi = n;
  long long ans = LLONG_MAX;
  while (lo <= hi) {
    long long mid = (lo + hi) / 2;
    long long temp = upper_bound(a, a + n, mid) - a;
    temp = n - temp;
    if (temp <= k) {
      ans = min(ans, mid);
      hi = mid - 1;
    } else {
      lo = mid + 1;
    }
  }
  for (long long i = 0; i < n; i++) a[i] = temp[i];
  r = ans;
  dfs(0, -1);
  cout << r << endl;
  for (long long i = 0; i < n - 1; i++) cout << ::ans[i] << " ";
  cerr << "Time : " << (double)clock() / (double)CLOCKS_PER_SEC << "s\n";
}
