#include <bits/stdc++.h>
#pragma warning(disable : 4996)
#pragma comment(linker, "/STACK:336777216")
using namespace std;
inline long long gcd(long long a, long long b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
inline long long power(long long a, long long n, long long m) {
  if (n == 0) return 1;
  long long p = power(a, n / 2, m);
  p = (p * p) % m;
  if (n % 2)
    return (p * a) % m;
  else
    return p;
}
const long long MOD = 1000000007;
const long long int INF = 0x3f3f3f3f;
const long long LL_INF = 0x3f3f3f3f3f3f3f3f;
vector<long long int> adj[200000 + 1];
long long int dg[200001], ans;
map<pair<long long int, long long int>, long long int> mp;
vector<pair<long long int, long long int> > edge;
map<pair<long long int, long long int>, long long int>::iterator it;
int32_t main() {
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  ;
  long long int n, k, u, v, mx = 0;
  cin >> n >> k;
  for (long long int i = 0; i < n - 1; i++) {
    cin >> u >> v;
    adj[u].push_back(v);
    adj[v].push_back(u);
    dg[u]++;
    dg[v]++;
    edge.push_back(make_pair(min(u, v), max(u, v)));
    mx = max(mx, dg[u]);
    mx = max(mx, dg[v]);
  }
  if (k == 0 && mx == n - 1) {
    cout << mx << "\n";
    for (long long int i = 0; i < n - 1; i++) cout << i + 1 << " ";
    cout << "\n";
    return 0;
  }
  long long int l = 1, r = n, cnt, m;
  while (r >= l) {
    m = (l + r) / 2;
    cnt = 0;
    for (long long int i = 1; i <= n; i++)
      if (dg[i] > m) cnt++;
    if (cnt > k) {
      l = m + 1;
    } else {
      ans = m;
      r = m - 1;
    }
  }
  cout << ans << "\n";
  queue<pair<long long int, long long int> > q;
  pair<long long int, long long int> p;
  long long int cr, todiscard;
  bool visited[n + 1];
  memset(visited, 0, sizeof(visited));
  q.push(make_pair(1, -1));
  while (!q.empty()) {
    p = q.front();
    q.pop();
    u = p.first;
    todiscard = p.second;
    cr = 1;
    for (long long int i = 0; i < adj[u].size(); i++) {
      v = adj[u][i];
      if (!visited[v]) {
        if (dg[u] <= ans)
          if (cr == todiscard) {
            cr = (cr + 1);
          }
        if (cr == ans + 1) {
          cr = 1;
          if (dg[u] <= ans)
            if (todiscard == 1) cr++;
        }
        q.push(make_pair(v, cr));
        mp.insert(make_pair(make_pair(min(u, v), max(u, v)), cr));
        visited[v] = 1;
        cr++;
      }
    }
  }
  for (long long int i = 0; i < edge.size(); i++) {
    it = mp.find(edge[i]);
    cout << it->second << " ";
  }
  cout << "\n";
  return 0;
}
