/*
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
ordered_set -> less -> less_equal
ordered_set find_by_order() -> возвращает k-ый элемент(отсчёт с нуля)
ordered_set order_of_key() -> возвращает количество элементов в множестве,строго меньших,чем наш элемент
*/
#include <bits/stdc++.h>
#include <random>
#include <ext/pb_ds/assoc_container.hpp>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define ub upper_bound
#define lb lower_bound
#define bit __builtin_popcount
#define memset(x) memset(x,0,sizeof(x))

using namespace std;
using namespace __gnu_pbds;

template<typename T> using ordered_set=tree<T,null_type,less<T>,rb_tree_tag,tree_order_statistics_node_update>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());


typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<vector<int> > matrix;

inline void boost(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
}

const ll maxn=2e5+123;
const ll inf=1e9+123;
const ll linf=1e18+123;
const ll mod=1e9+7;
const double eps=1e-9;
const double pi=acos(-1);
int dx[8]={0,1,-1,0,1,-1,1,-1};
int dy[8]={1,0,0,-1,1,1,-1,-1};
ordered_set<int>num;
vector<pii>g[maxn];
int ans[maxn],last=0,n;
bool used[maxn];
void dfs(int v){
    used[v]=1;
    for(auto to:g[v]){
        if(ans[to.S]!=-1){
            continue;
        }
        ans[to.S]=last;
        last+=2;
        if(last>n-2){
            last=1;
        }
    }
    for(auto to:g[v]){
        if(used[to.F]==1){
            continue;
        }
        dfs(to.F);
    }
}
int main(){
    boost();
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    cin>>n;
    for(int i=1,u,v;i<n;i++){
        cin>>u>>v;
        g[u].pb({v,i});
        g[v].pb({u,i});
        num.insert(i-1);
        ans[i]=-1;
    }
    int root=0,mx=0;
    for(int i=1;i<=n;i++){
        if(mx<g[i].size()){
            mx=g[i].size();
            root=i;
        }
    }
    dfs(root);
    for(int i=1;i<n;i++){
        cout<<ans[i]<<"\n";
    }
	exit(0);
}
