#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > E[1 << 18];
int A[1 << 18];
int B[1 << 18];
pair<int, int> C[1 << 18];
int gCnt;
void add(int a, int b) {
  E[a].push_back(pair<int, int>(b, gCnt));
  A[gCnt] = a;
  B[gCnt] = b;
  ++gCnt;
}
int SolveTest(int test) {
  int n;
  cin >> n;
  int i, j;
  gCnt = 0;
  for (i = (1); i < (n); ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    add(a, b);
    add(b, a);
  }
  for (i = (0); i < (gCnt); ++i) C[i] = pair<int, int>(-1, -1);
  int cnt[n];
  for (i = (0); i < (n); ++i) cnt[i] = int((E[i]).size());
  queue<int> q;
  for (i = (0); i < (n); ++i)
    if (cnt[i] <= 1) q.push(i);
  while (!q.empty()) {
    int a = q.front();
    q.pop();
    int z = -1;
    pair<pair<int, int>, pair<int, int> > res(pair<int, int>(0, 0),
                                              pair<int, int>(0, 0));
    for (i = (0); i < (int((E[a]).size())); ++i) {
      int b = E[a][i].first;
      int e = E[a][i].second;
      if (C[e].first == -1)
        z = e;
      else {
        pair<int, int>& r = C[e];
        if (r.first > res.first.first) {
          res.second.first = res.first.first;
          res.first.first = r.first;
        } else
          res.second.first = max(res.second.first, r.first);
        if (r.second > res.first.second) {
          res.second.second = res.first.second;
          res.first.second = r.second;
        } else
          res.second.second = max(res.second.second, r.second);
      }
    }
    for (i = (0); i < (int((E[a]).size())); ++i) {
      int b = E[a][i].first;
      int e = E[a][i].second;
      pair<int, int>& r = C[e ^ 1];
      if (z != -1 && z != e) continue;
      if (r.first != -1) continue;
      if (int((E[a]).size()) <= 1)
        r = pair<int, int>(0, 1);
      else {
        pair<int, int>& t = C[e];
        r.first =
            t.second == res.first.second ? res.second.second : res.first.second;
        r.second =
            t.first == res.first.first ? res.second.first : res.first.first;
        r.first += int((E[a]).size()) - 2;
        r.second = max(r.second + 1, r.first);
      }
      --cnt[b];
      if (cnt[b] <= 1) q.push(b);
    }
  }
  int res = 0;
  for (i = 0; i < gCnt; i += 2) {
    pair<int, int> ra = C[i];
    pair<int, int> rb = C[i + 1];
    res = max(res, ra.first + rb.second);
    res = max(res, ra.second + rb.first);
  }
  cout << res << endl;
  return 0;
}
int main() {
  int T, t;
  T = 1;
  for (t = (0); t < (T); ++t) SolveTest(t);
  return 0;
};
