#include <iostream>

using namespace std;
typedef long long ll;
struct teritorija{
    ll t;
    ll g;
};
void sortiraj(teritorija a[],int n){
  for(int i=0;i<n-1;i++)
  for(int j=i+1;j<n;j++){
    if(a[i].t>a[j].t){
        teritorija pom=a[i];
        a[i]=a[j];
        a[j]=pom;
    }
    else if(a[i].t==a[j].t){
        if(a[i].g>a[j].g){
            teritorija pom=a[i];
            a[i]=a[j];
            a[j]=pom;
        }

    }
  }

}
ll maks(teritorija a[],ll n,bool mark[]){
    ll ind,maks=1,pom=1;
    for(int i=0;i<n;i++)
    if(!mark[i]){
        ind=i;
        i=n;
    }
    for(int i=0;i<n-1;i++){
        if(!mark[i]){
        if(a[i].g==a[i+1].t)pom++;
        else if(a[i].g!=a[i+1].t&&a[i].t!=a[i+1].t){
            if(pom>maks){
                maks=pom;
                ind=pom-i-1;
                pom=0;
            }
        }
       else if(a[i].t==a[i+1].t) pom++;
        else {
            if(pom>maks){
                maks=pom;
                ind=i-pom;
                pom=0;
            }
          }
        }
    }
    return ind;


}
ll mini(teritorija a[],ll n){
    ll p,d;//broj teritorija igraca
    if(n%2==0) p=d=n/2;
    else{
        p=n/2+1;
        d=n/2;
    }
    ll ind[p],i=1;
    bool mark[n]={false};
    ind[0]=maks(a,n,mark);
    mark[maks(a,n,mark)]=true;
    while(i<p){
          mark[maks(a,n,mark)]=true;
          ind[i]=maks(a,n,mark);
          mark[ind[i]]=true;
          i++;
    }
    ll mraz=0,raz;
    for(int j=0;j<p-1;j++)
        for(int k=j+1;k<p;k++){
           if( a[ind[j]].t==a[ind[k]].t||a[ind[j]].t==a[ind[k]].g){
                raz=2;
                if(raz>mraz) mraz=raz;
            }
            else{
                raz=k-j+2;
                if(raz>mraz) mraz=raz;
            }
        }
        return mraz;


}
int main()
{
   ll n;
   cin >> n;
   teritorija a[n];
   for(int i=0;i<n-1;i++)
    cin >> a[i].t >> a[i].g;
    sortiraj(a,n);
    //bool mark[n]={false};
    cout << mini(a,n)-2 << '\n';
    return 0;
}