In [ ]:
class Node:
    node_number = None
    neigbour = []
    is_visited = False
    max_distance_from_leaf = 0
    all_distances = []
    
    def __init__(self, _node_number):
        self.node_number = _node_number
        self.neigbour = []
        self.all_distances = []
        self.is_visited = False

In [ ]:
def dfs(start_node):
    start_node.is_visited = True
    
    for i in range(0, len(start_node.neigbour)):
        neigh_node = start_node.neigbour[i]
        if not neigh_node.is_visited:
            dist_from_neigh = dfs(neigh_node)
            start_node.all_distances.append(dist_from_neigh)
            start_node.max_distance_from_leaf = max(start_node.max_distance_from_leaf, dist_from_neigh)
        
    return 1 + start_node.max_distance_from_leaf

In [ ]:
node_dict = {}

no_nodes = int(raw_input())

for i in range(0, no_nodes):
    number = i + 1
    node = Node(number)
    node_dict[number] = node
    
node_start = None

for i in range(0, no_nodes-1):
    neighs = map(int, raw_input().split())
    
    a = neighs[0]
    b = neighs[1]
    
    node_a = node_dict[a]
    
    if node_start is None:
        node_start = node_a
        
    node_b = node_dict[b]
    
    node_a.neigbour.append(node_b)
    node_b.neigbour.append(node_a)

if no_nodes == 0 or no_nodes == 1:
    print 0
elif no_nodes == 2:
    print 1
else:
    dfs(node_start)
    
    max_dist = 0
    
    for i in range (0, no_nodes):
        curr_node = node_dict[i+1]
        curr_node.all_distances.sort(reverse=True)
        if len(curr_node.all_distances) == 1:
            max_dist = max(max_dist, curr_node.all_distances[0])
        elif len(curr_node.all_distances) > 1:
            max_dist = max(max_dist, curr_node.all_distances[0] + curr_node.all_distances[1])
    
    print max_dist