#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define cmax(a,b) a=max(a,b)
#define cmin(a,b) a=min(a,b)
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define sz(x) (int)x.size()
// #define int long long
int solve();
signed main() {
ios::sync_with_stdio(0); cin.tie(0);
cout << solve() << endl;
return 0;
}
int n;
vector<int> a;
int solve() {
cin >> n;
a.resize(n);
map<string, int> mp; int cur=0;
vector<set<int>> visited(n);
vector<bool> connected(n, 1);
vector<string> vec;
int cnt=0;
int ans=0;
for (int i=0; i<n; i++) {
string s, t; cin >> s >> t;
if (!mp.count(s)) mp[s]=cur++, vec.pb(s);
if (!mp.count(t)) mp[t]=cur++, vec.pb(t);
a[mp[s]]=mp[t];
visited[mp[t]].insert(mp[s]);
if (mp[s]==mp[t]) connected[mp[s]]=0, cnt++;
}
for (int i=0; i<n; i++) if (a[i]!=i && a[a[i]]==i) {
connected[i]=0;
for (auto &x: visited[i]) if (x!=a[i]) cnt++, connected[x]=0;
}
if (n%2) return -1;
set<pair<int, int>> st; for (int i=0; i<n; i++) if (connected[i]) st.insert({sz(visited[i]), i});
while (!st.empty()) {
int u=st.begin()->se; st.erase(st.begin());
int v=a[u]; ans++;
auto nxtv=a[v];
if (connected[nxtv]) {
st.erase({sz(visited[nxtv]), nxtv});
visited[nxtv].erase(v);
st.insert({sz(visited[nxtv]), nxtv});
}
if (connected[v]) st.erase({sz(visited[v]), v});
else cnt--;
// cout << vec[u] << ' ' << vec[v] << endl;
connected[u]=connected[v]=0;
for (auto &x: visited[v]) if (connected[x]) connected[x]=0, cnt++, st.erase({sz(visited[x]), x});
for (auto &x: visited[u]) if (connected[x]) connected[x]=0, cnt++, st.erase({sz(visited[x]), x});
}
return cnt+ans;
}