#include <iostream>
#include <vector>
using namespace std;
class Tree {
public:
int n;
vector<vector<int>> adj;
Tree(int n) : n(n), adj(n + 1) {}
void addEdge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u);
}
int dfs(int u, int parent, vector<int>& subtreeSize) {
int size = 1;
for (int v : adj[u]) {
if (v!= parent) {
size += dfs(v, u, subtreeSize);
}
}
subtreeSize[u] = size;
return size;
}
int findCentroid() {
vector<int> subtreeSize(n + 1);
dfs(1, -1, subtreeSize);
int centroid = -1;
int minSize = n;
function<void(int, int)> find = [&](int u, int parent) {
bool isCentroid = true;
int maxSubtree = 0;
for (int v : adj[u]) {
if (v!= parent) {
if (subtreeSize[v] > n / 2) {
isCentroid = false;
}
maxSubtree = max(maxSubtree, subtreeSize[v]);
}
}
if (n - subtreeSize[u] > n / 2) {
isCentroid = false;
}
if (isCentroid && maxSubtree < minSize) {
centroid = u;
minSize = maxSubtree;
}
for (int v : adj[u]) {
if (v!= parent) {
find(v, u);
}
}
};
find(1, -1);
return centroid;
}
};
int solve(Tree& tree) {
int centroid = tree.findCentroid();
return tree.n - 1;
}
int main() {
int n;
cin >> n;
Tree tree(n);
for (int i = 0; i < n - 1; ++i) {
int u, v;
cin >> u >> v;
tree.addEdge(u, v);
}
cout << solve(tree) << endl;
return 0;
}