#include <bits/stdc++.h>
using namespace std;
#define int long long
#define double long double
const int MAXN = 1e5 + 5;
const int INF = 1e9 + 7;
int n, root, special;
int head[MAXN], par[MAXN], memo[MAXN][2][2][2][2];
vector<int> adj[MAXN];
int find(int u){
if(u == head[u]) return u;
return head[u] = find(head[u]);
}
void dfs(int u, int p){
par[u] = p;
for(int v : adj[u]){
if(v == p) continue;
dfs(v, u);
}
}
int dp(int x, int me, int up, int rt, int sp){
if(memo[x][me][up][rt][sp] != -1) return memo[x][me][up][rt][sp];
bool ok = 1;
if(x == root && me != rt) ok = 0;
if(x == special && me != sp) ok = 0;
if(x == special && rt && up) ok = 0;
if(!ok) return memo[x][me][up][rt][sp] = INF;
bool covered = 0;
if(up) covered = 1;
if(x == special && rt) covered = 1;
if(x == root && sp) covered = 1;
int sum = me;
for(int v : adj[x]){
if(v == par[x]) continue;
sum += dp(v, 0, me, rt, sp);
}
int res = INF;
if(covered){
res = min(res, sum);
}
else{
for(int v : adj[x]){
if(v == par[x]) continue;
res = min(res, sum - dp(v, 0, me, rt, sp) + dp(v, 1, me, rt, sp));
}
}
return memo[x][me][up][rt][sp] = res;
}
void solve() {
cin >> n;
memset(memo, -1, sizeof(memo));
for(int i = 1; i <= n; i++){
head[i] = i;
}
for(int i = 1; i <= n; i++){
int u, v; cin >> u >> v;
int pu = find(u);
int pv = find(v);
if(pu == pv){
root = u;
special = v;
}
else{
head[pv] = pu;
adj[u].push_back(v);
adj[v].push_back(u);
}
}
dfs(root, 0);
int ans = INF;
for(int rt = 0; rt <= 1; rt++){
for(int sp = 0; sp <= 1; sp++){
ans = min(ans, dp(root, rt, 0, rt, sp));
}
}
if(ans == INF){
cout <<"-1\n";
}
else{
cout << ans << '\n';
}
}
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int tt;
tt = 1;
while (tt--) {
solve();
}
}