//Don't have to see. start------------------------------------------
var read = require('readline').createInterface({
  input: process.stdin, output: process.stdout
});
var obj; var inLine = [];
read.on('line', function(input){inLine.push(input);});
read.on('close', function(){
  obj = init(inLine);
  console.error('\n');
  var start = Date.now();
  Main();
  var end = Date.now() - start;
  myerr('time : ' + end + 'ms');
  myerr('memory : ' + Math.round(process.memoryUsage().heapTotal / 1024) + 'KB');
});
function makeClone(obj){return (obj instanceof Set) ? new Set(Array.from(obj)) : JSON.parse(JSON.stringify(obj));}
function nextInt(){return myconv(next(),1);} function nextStrArray(){return myconv(next(),2);}
function nextIntArray(){return myconv(next(),4);} function nextCharArray(){return myconv(next(),6);}
function next(){return obj.next();} function hasNext(){return obj.hasNext();}
function init(input){  
  return {
    list : input, index : 0, max : input.length,
    hasNext : function(){return (this.index < this.max);},
    next : function(){if(this.hasNext()){return this.list[this.index++];}else{throw 'ArrayIndexOutOfBoundsException ‚There is no more input';}}
  };
}
function myout(s){console.log(s);}
function myerr(s){console.error('debug:' + require('util').inspect(s,false,null));}
//param "no" is
//unknown or outlier : return i. 1: parseInt.
//2: split space. 4: split space and parseInt.
//6: split 1 character. 7: split 1 character and parseInt.
//8: join space. 9: join nextline. 0: join no character.
function myconv(i,no){try{switch(no){case 1:return parseInt(i);case 2:return i.split(' ');case 4:return i.split(' ').map(Number);case 6:return i.split('');case 7:return i.split('').map(Number);case 8:return i.join(' ');case 9:return i.join('\n');case 0:return i.join('');default:return i;}}catch(e){return i;}}

//Don't have to see. end------------------------------------------
function Main(){
  var N =nextInt();
  var list = new Array(N);
  for(var i = 0; i < N; i++){
  	list[i] = {
  		child : [],
  		access : false
  	};
  }
  var map = {};
  for(var i = 0; i < N - 1; i++){
  	var tmp = nextIntArray();
  	tmp[0]--;
  	tmp[1]--;
  	list[tmp[0]].child.push(tmp[1]);
  	list[tmp[1]].child.push(tmp[0]);
  	map[tmp[0] + ":" + tmp[1]] = {
  		no : i,
  		color : -1
  	};
  }
  var maxColor = 0;
  var queue = new Array(100007);
  queue[0] = [0, -1];
  var maeIndex = 0;
  var atoIndex = 1;
  list[0].access = true;
  while(maeIndex != atoIndex){
  	var now = queue[maeIndex];
  	maeIndex++;
  	var index = now[0];
  	var used = now[1];
  	var child = list[index].child;
  	var c = 1;
  	for(var i = 0; i < child.length; i++){
  		if(!list[child[i]].access){
  			if(c == used){
  				c++;
  			}
  			var L = index;
  			var R = child[i];
  			if(L > R){
  				var tmp = L;
  				L = R;
  				R = tmp;
  			}
  			map[L + ":" + R].color = c;
  			list[child[i]].access = true;
  			queue[atoIndex] = [child[i], c];
  			atoIndex++;
  			maxColor = Math.max(maxColor, c);
  			c++;
  		}
  		
  	}
  }
  myout(maxColor);
  var output = new Array(N - 1);
  var keys = Object.keys(map);
  for(var i = 0; i < keys.length; i++){
  	output[map[keys[i]].no] = map[keys[i]].color;
  }
  myout(myconv(output, 9));
}

Measured memory_bytes: 135208