#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define dbg(x) cout << #x << " : " << x << endl
#define rep(i, a, b) for (int i = (a); i <= (b); i++)
#define maxn 100005
vector<ll> edges[maxn];
ll n;
ll dem = 0;
ll dau[maxn];
ll check[maxn], point_edges[maxn];
map<pair<ll, ll>, ll> mapping;
ll maax = 0;
ll bd;
struct cap
{
    ll x, y;
};
void bfs(ll source)
{
    dau[source] = 1;
    queue<ll> q;
    q.push(source);
    while (!q.empty())
    {
        ll p = q.front();
        q.pop();
        bd = point_edges[p] + 1;
        for (auto v : edges[p])
        {
            if (dau[v] == 1)
                continue;
            dau[v] = 1;
            mapping[{p, v}] = mapping[{v, p}] = point_edges[v] = bd % maax;
            // cout<<"("<<p+1<<","<<v+1<<"):"<<bd%maax<<'\n';
            bd++;
            q.push(v);
        }
    }
}
int main()
{
    // freopen("input.txt", "r", stdin);
    // freopen("output.txt", "w", stdout);
    memset(point_edges, -1, sizeof(point_edges));
    cin >> n;
    cap a[n];
    for (ll i = 0; i < n - 1; i++)
    {
        ll u, v;
        cin >> u >> v;
        u--, v--;
        edges[u].push_back(v);
        edges[v].push_back(u);
        a[i].x = u;
        a[i].y = v;
        mapping[{u, v}] = -1;
        mapping[{v, u}] = -1;
    }

    ll vt;
    for (ll i = 0; i < n; i++)
    {
        // cout<<i+1<<"-->";
        // for(auto v: edges[i]) cout<<v<<" ";
        // cout<<'\n';
        ll tmp = edges[i].size();
        if (tmp > maax)
        {
            maax = tmp;
            vt = i;
        }
    }
    cout << maax << '\n';
    bfs(0);
    // cout<<"--------\n";
    for (ll i = 0; i < n - 1; i++)
        cout << mapping[{a[i].x, a[i].y}] + 1 << '\n';
    return 0;
}