#include <bits/stdc++.h>
using namespace std;
struct kraw {
  int a;
  int kier;
};
int n;
const int INF = 1000000000;
int Ile(vector<vector<kraw> >& T, int root) {
  stack<int> S;
  vector<bool> odw(n, false);
  int D = 0;
  vector<int> w_gore(n, 0), w_dol(n, 0);
  S.push(root);
  odw[root] = true;
  while (!S.empty()) {
    int akt = S.top();
    S.pop();
    for (int i = 0; i < T[akt].size(); ++i) {
      if (!odw[T[akt][i].a]) {
        odw[T[akt][i].a] = true;
        S.push(T[akt][i].a);
        w_gore[T[akt][i].a] = w_gore[akt];
        w_dol[T[akt][i].a] = w_dol[akt];
        if (T[akt][i].kier == 0) {
          ++D;
          ++w_gore[T[akt][i].a];
        } else
          ++w_dol[T[akt][i].a];
      }
    }
  }
  for (int i = 0; i < n; ++i) odw[i] = false;
  vector<vector<int> > podd;
  for (int i = 0; i < T[root].size(); ++i) {
    S.push(T[root][i].a);
    odw[T[root][i].a] = true;
    vector<int> spojna;
    while (!S.empty()) {
      int akt = S.top();
      S.pop();
      spojna.push_back(akt);
      for (int j = 0; j < T[akt].size(); ++j) {
        if (!odw[T[akt][j].a] && T[akt][j].a != root) {
          odw[T[akt][j].a] = true;
          S.push(T[akt][j].a);
        }
      }
    }
    podd.push_back(spojna);
  }
  vector<int> r(podd.size(), -INF);
  for (int i = 0; i < podd.size(); ++i)
    for (int j = 0; j < podd[i].size(); ++j)
      r[i] = max(r[i], w_gore[podd[i][j]] - w_dol[podd[i][j]]);
  sort(r.begin(), r.end());
  reverse(r.begin(), r.end());
  int dwa = INF, jeden = INF;
  if (podd.size() >= 2) dwa = D - r[0] - r[1];
  jeden = D - r[0];
  return min(dwa, jeden);
}
int main() {
  ios_base::sync_with_stdio(0);
  cin >> n;
  if (n == 1) {
    cout << "0";
    return 0;
  }
  vector<vector<kraw> > T(n);
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    cin >> a >> b;
    --a;
    --b;
    T[a].push_back({b, 1});
    T[b].push_back({a, 0});
  }
  int odp = INF;
  for (int i = 0; i < n; ++i) odp = min(odp, Ile(T, i));
  cout << odp;
  return 0;
}
