#include <bits/stdc++.h>
using namespace std;
const int tamanho_maximo = 500500;
vector<int> L;
vector<int> arvore[tamanho_maximo];
void T(int nivel, int quem_ignorar, int quem_sou) {
  if (arvore[quem_sou].size() == 1) {
    L.push_back(nivel);
    return;
  }
  for (int adjacente : arvore[quem_sou])
    if (adjacente != quem_ignorar) T(nivel + 1, quem_sou, adjacente);
}
int calcula_tempo(vector<int> folhas) {
  if (folhas.size() == 1) {
    return folhas.at(0);
  }
  int count = 0;
  sort(folhas.begin(), folhas.end());
  for (vector<int>::iterator itr = folhas.begin(); itr != folhas.end(); ++itr) {
    int folha = *itr;
    if (folha > count) {
      count = folha;
    } else {
      count += 1;
    }
  }
  return count;
}
int main() {
  int N;
  scanf("%d", &N);
  int x, y;
  for (int i = 0; i < N - 1; i++) {
    scanf("%d %d", &x, &y);
    arvore[x].push_back(y);
    arvore[y].push_back(x);
  }
  int maior_tempo = 0;
  for (int itr : arvore[1]) {
    int galho = itr;
    L.clear();
    T(1, 1, galho);
    int tempo_do_galho = calcula_tempo(L);
    if (tempo_do_galho > maior_tempo) {
      maior_tempo = tempo_do_galho;
    }
  }
  cout << maior_tempo;
  return 0;
}
