#define _CRT_SECURE_NO_DEPRECATE #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mpair make_pair #define all(v) v.begin(),v.end() using namespace std; typedef long long ll; typedef long double ld; const ld epsylon = 1e-9; vector cols; int main() { freopen("tcoloring.in","r",stdin); freopen("tcoloring.out","w",stdout); int n; cin >> n; vector > > ne(n); for (int i = 0; i < n-1;++i){ int f,t; scanf("%d %d",&f, &t); f--; t--; ne[f].push_back(mpair(t, i)); ne[t].push_back(mpair(f, i)); } int ans = 0; for (int i = 0; i < n ;++i){ ans = max(ans, (int)ne[i].size()); } cols.resize(n-1, -1); int beg; for (int i = 0; i < (int)ne.size();++i){ if (ne[i].size() == 1) { beg = i; break; } } queue tc; vector vis(n, 0); tc.push(beg); vis[beg] = 1; //for (int i = 0; i < (int)ne[beg].size(); ++i) { // cols[ne[beg][i].second] = i + 1; //} while (!tc.empty()) { int c = tc.front();tc.pop(); set used; for (int i = 0; i < (int)ne[c].size();++i){ if (cols[ne[c][i].second] != -1) { used.insert(cols[ne[c][i].second]); } } int color = 1; for (int i = 0; i < (int)ne[c].size();++i){ if (cols[ne[c][i].second] != -1 || vis[ne[c][i].first]) { continue; } while (used.count(color)) { color++; } cols[ne[c][i].second] = color; color++; tc.push(ne[c][i].first); vis[ne[c][i].first] = 1; } } printf("%d\n", ans); for (int i =0 ; i < (int)cols.size();++i){ printf("%d\n", cols[i]); } return 0; }