#include<bits/stdc++.h>
using namespace std;
const int maxN=1e6;
int card[maxN][2], num[maxN*2], p[maxN*2];
int vn[maxN*2], en[maxN*2], mv[maxN*2];//vertix edge minNum
long sv[maxN*2];


int findP(int x){
	return (x==p[x])?x:p[x]=findP(p[x]);
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int N;
	cin>>N;
	for(int i=0; i<N; i++){
		cin>>card[i][0]>>card[i][1];
		num[i]=card[i][0];
		num[i+N]=card[i][1];
	}
	//離散化
	sort(num,num+N*2);
	int uN=unique(num,num+N*2)-num;
	//DSU
	for(int i=0; i<uN; i++){
		p[i]=i, vn[i]=1, en[i]=0;
		sv[i]=mv[i]=num[i];
	}
	for(int i=0; i<N; i++){
		int n1=lower_bound(num,num+uN,card[i][0])-num;
		int n2=lower_bound(num,num+uN,card[i][1])-num;
		int p1=findP(n1), p2=findP(n2);
		if(p1!=p2){
			p[p2]=p1;
			vn[p1]+=vn[p2];
			en[p1]+=en[p2]+1;
			mv[p1]=min(mv[p1],mv[p2]);
			sv[p1]+=sv[p2];
		}else en[p1]++;
	}
	long ans=0;
	for(int i=0; i<uN; i++){
		if(i!=findP(i)) continue;
		ans+=sv[i]-(en[i]>=vn[i]?0:mv[i]);
	}cout<<ans;
}