Problem: Consider a string with rings on both ends. Rings have positive integers to distinguish them. Rings on both ends of the string have different numbers a and b. Describe this as [a, b]. If there are multiple strings and the number attached to the ring of one string and the other string is the same, these strings can be connected at that ring, and the one made by connecting is called a chain. For example, the strings [1, 3] and [3, 4] form the chain [1, 3, 4]. The string and the chain or the chains are also connected at the ring with the same integer. Suppose you can.

For example, a chain [1, 3, 4] and a string [5, 1] ​​can form [5, 1, 3, 4], and a chain [1, 3, 4] and a chain [2, 3, 5] can form [5, 1, 3, 4]. The chain [1, 3, 4] and the chain [4, 6, 1] form a ring.

There are various shapes like this, but in some of them, rings with the same number follow only once. Multiple connected strings are called chains. For example, chains [1, 3, 4] The centrally crossed shape of the chains [2, 3, 5] also includes the chains [1, 3, 5], [2, 3, 4], and the chains [1, 3, 4]. And chains [4, 6, 1] loops include chains such as [1, 3, 4, 6], [3, 4, 6, 1], [4, 6, 1, 3]. ..

For these chains, the number contained is defined as the length. For a given number of strings, anything that can be connected can form a shape that contains one or more chains. Create a program to find the length of the chain.

The first line of the input data contains the number of strings, the positive integer 1 ≤ n ≤ 100, and each of the following n lines contains two integers a, b separated by blanks 1 ≤ a <b ≤ 100. The two integers in each line represent the integers at both ends of one string.

Input example 1 | Input example 2 | Input example 3
--- | --- | ---
|
7 | 6 | 7
1 3 | 1 2 | 1 3
3 4 | 2 3 | 2 4
1 4 | 3 4 | 3 5
2 7 | 4 5 | 4 6
5 7 | 1 5 | 6 7
6 7 | 2 6 | 2 6
1 7 | | 4 7
Output example 1 | Output example 2 | Output example 3
5 | 6 | 4

input

The input consists of multiple datasets. Input ends when n is 0. The number of datasets does not exceed 10.

output

For each dataset, the maximum chain length is output on one line.





Example

Input

7
1 3
3 4
1 4
2 7
5 7
6 7
1 7
6
1 2
2 3
3 4
4 5
1 5
2 6
7
1 3
2 4
3 5
4 6
6 7
2 6
4 7
0


Output

5
6
4

Solution (in CPP):

Solution:
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;


int N;
int in_num[101];
int tmp_depth;
vector<int> G[101],GROUP[101];

int boss[101],height[101];

int get_boss(int id){
	if(boss[id] == id)return id;
	else{
		return boss[id] = get_boss(boss[id]);
	}
}


void unite(int x,int y){
	int boss_x = get_boss(x);
	int boss_y = get_boss(y);

	if(boss_x == boss_y)return;

	if(height[x] > height[y]){

		boss[boss_y] = boss_x;

	}else if(height[x] < height[y]){

		boss[boss_x] = boss_y;

	}else{ //height[x] == height[y]

		boss[boss_y] = boss_x;
		height[x]++;
	}
}

void init(){
	for(int i = 1; i <= 100; i++){
		boss[i] = i;
		height[i] = 0;
	}
}

void recursive(bool visited[101],int node_id,int depth,int group_id){
	tmp_depth = max(tmp_depth,depth);

	for(int i = 0; i < G[node_id].size(); i++){
		if(visited[G[node_id][i]])continue;

		bool next_visited[101];
		for(int k = 0; k < GROUP[group_id].size(); k++)next_visited[GROUP[group_id][k]] = visited[GROUP[group_id][k]];	//???????????°?????????????????±?????????????¶??????°??????
		next_visited[G[node_id][i]] = true;
		recursive(next_visited,G[node_id][i],depth+1,group_id);
	}
}


void func(){

	for(int i = 1; i <= 100; i++){
		in_num[i] = 0;
		G[i].clear();
		GROUP[i].clear();
	}

	init();

	int from,to;
	for(int loop = 0; loop < N; loop++){
		scanf("%d %d",&from,&to);
		G[from].push_back(to);
		G[to].push_back(from);
		in_num[to]++;
		in_num[from]++;
		unite(from,to);
	}

	for(int i = 1; i <= 100; i++){
		if(in_num[i] == 0)continue;
		GROUP[get_boss(i)].push_back(i);
	}

	int max_depth = 1,min_in_num;
	bool visited[101];
	for(int i = 1; i <= 100; i++){
		if(GROUP[i].size() == 0 || GROUP[i].size() < max_depth)continue;

		min_in_num = BIG_NUM;
		for(int k = 0; k < GROUP[i].size(); k++){
			min_in_num = min(min_in_num,in_num[GROUP[i][k]]);
		}

		for(int k = 0; k < GROUP[i].size(); k++){
			if(in_num[GROUP[i][k]] == min_in_num){
				for(int p = 0; p < GROUP[i].size(); p++)visited[GROUP[i][p]] = false;
				visited[GROUP[i][k]] = true;
				tmp_depth = 0;
				recursive(visited,GROUP[i][k],1,i);
				max_depth = max(max_depth,tmp_depth);
			}
		}
	}
	printf("%d\n",max_depth);
}


int main(){

	while(true){
		scanf("%d",&N);
		if(N == 0)break;

		func();
	}

	return 0;
}