#include <bits/stdc++.h>   using namespace std;   const int N = 200100;   const int M = 2 * N;   const long long MOD1 = 98764321261LL;   const long long MOD = 998244353LL;   inline int lowbit(int x) { return x & (-x); }   struct fenwick {     long long a[N];     int n;     void init(int n) {       for (int i = 0; i <= n; ++i) a[i] = 0;       this->n = n;     }     void add(int x, long long v) {       for (int i = x; i <= n; i += lowbit(i)) a[i] += v;     }     long long query(int x) {       long long ret = 0;       for (int i = x; i; i ^= lowbit(i)) ret += a[i];       return ret;     }     void rangeadd(int l, int r, long long v) {       add(l, v);       add(r + 1, -v);     }     long long rangequery(int l, int r) {       l = max(l, 1);       r = min(r, n);       if (r < l) return 0;       long long ret = query(r);       ret -= query(l - 1);       return ret;     }   };   inline long long powmod(long long x, long long y, long long MOD) {     long long ret = 1;     while (y) {       if (y & 1LL) ret = ret * x % MOD;       x = x * x % MOD;       y = y >> 1;     }     return ret;   }   struct graph {     int head[N], next[M], to[M];     int tot;     inline void init(int n) {       for (int i = 0; i <= n; ++i) head[i] = -1;       tot = 0;     }     inline void addedge(int x, int y) {       to[tot] = y;       next[tot] = head[x];       head[x] = tot;       ++tot;     }   };   struct point {     long long x, y;     point() {}     point(long long x, long long y) : x(x), y(y) {}     void read() { scanf( %lld%lld , &x, &y); }     point operator+(const point &rhs) const {       return point(x + rhs.x, y + rhs.y);     }     point operator-(const point &rhs) const {       return point(x - rhs.x, y - rhs.y);     }     long long operator^(const point &rhs) const { return x * rhs.y - y * rhs.x; }     bool operator<(const point &rhs) const {       if (y != rhs.y) return y < rhs.y;       return x < rhs.x;     }   };   long long phi(long long x) {     long long res = x;     for (long long i = 2; i * i <= x; ++i) {       if (x % i == 0) {         res = res / i * (i - 1);         while (x % i == 0) x /= i;       }     }     if (x > 1) res = res / x * (x - 1);     return res;   }   int n, m;   int ans;   int a[N], b[N], deg[N];   graph G;   void dfs(int x, int p) {     a[x] = 1;     b[x] = 0;     int chcnt = 0;     int maxa = -1;     int maxb = -1;     for (int i = G.head[x]; i != -1; i = G.next[i]) {       int y = G.to[i];       if (y == p) continue;       dfs(y, x);       int temp;       if (maxa != -1) {         temp = a[maxa] + a[y] + deg[x] - 2;         ans = max(ans, temp);         temp = a[maxa] + b[y] + deg[x] - 2;         ans = max(ans, temp);       }       if (maxb != -1) {         temp = b[maxb] + b[y] + deg[x] - 2;         ans = max(ans, temp);         temp = b[maxb] + b[y] + 1;         ans = max(ans, temp);         temp = b[maxb] + a[y] + deg[x] - 2;         ans = max(ans, temp);       }       a[x] = max(a[x], b[y] + 1);       b[x] = max(b[x], a[y] + deg[x] - 1 - (p != 0));       b[x] = max(b[x], b[y] + deg[x] - 1 - (p != 0));       if (maxa == -1 || a[y] > a[maxa]) maxa = y;       if (maxb == -1 || b[y] > b[maxb]) maxb = y;     }     ans = max(ans, a[x]);     ans = max(ans, b[x] + (p != 0));   }   int main() {     int cases = 1;     for (int iii = 1; iii <= cases; ++iii) {       scanf( %d , &n);       G.init(n);       for (int i = 1; i < n; ++i) {         int x, y;         scanf( %d%d , &x, &y);         G.addedge(x, y);         G.addedge(y, x);         ++deg[x];         ++deg[y];       }       ans = 0;       dfs(1, 0);       printf( %d n , ans);     }   }