#include <bits/stdc++.h>
#define ll long long
using namespace std;
vector <vector <int>> g, rg;
vector <bool> ciklus, vis, uparen;
int neupareni=0, ans=0;
void dfs (int st)
{
vector <int> cik;
cik.push_back(st);
int trn=g[st].back();
while (trn!=st)
{
cik.push_back(trn);
trn=g[trn].back();
}
vector <int> duzine;
int duz=0;
for (auto i: cik)
{
vis[i]=true;
if (uparen[i])
{
duzine.push_back(duz);
duz=0;
}
else duz++;
}
if (duzine.size()==0)
{
if (cik.size()==2)
{
return;
}
duzine.push_back(duz);
}
else duzine[0]+=duz;
for (auto i: duzine)
{
if (i%2!=0)
{
ans+=(i-1)/2;
neupareni++;
}
else ans+=i/2;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n; cin>>n;
map <string, int> nomenklatura;
g.resize(n); rg.resize(n);
int cntr=0;
for (int i=0; i<n; i++)
{
string s1, s2;
cin>>s1>>s2;
if (nomenklatura[s1]==0)
{
cntr++;
nomenklatura[s1]=cntr;
}
if (nomenklatura[s2]==0)
{
cntr++;
nomenklatura[s2]=cntr;
}
g[nomenklatura[s1]-1].push_back(nomenklatura[s2]-1);
rg[nomenklatura[s2]-1].push_back(nomenklatura[s1]-1);
}
if (n%2!=0) cout<<-1<<endl;
else
{
queue <int> kuku;
vector <int> cnt(n);
for (int i=0; i<n; i++)
{
cnt[i]=rg[i].size();
if (rg[i].size()==0)
{
kuku.push(i);
}
}
ciklus.assign(n, true);
uparen.assign(n, false);
while (!kuku.empty())
{
int top=kuku.front();
ciklus[top]=false;
kuku.pop();
for (auto i: g[top])
{
int j=g[i].back();
if (!uparen[i] && !uparen[top] && i!=top && !(j!=i && g[j].back()==i))
{
uparen[top]=true;
uparen[i]=true;
}
cnt[i]--;
if (cnt[i]==0)
{
kuku.push(i);
}
}
}
int upareni=0;
for (int i=0; i<n; i++)
{
if (uparen[i]) upareni++;
else if (!ciklus[i]) neupareni++;
}
ans+=upareni/2;
vis.assign(n, false);
for (int i=0; i<n; i++)
{
if (ciklus[i] && !vis[i])
{
dfs(i);
}
}
ans+=neupareni;
cout<<ans<<endl;
}
return 0;
}