#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>
#include<vector>
#include<algorithm>
#include<set>
#include<queue>

using namespace std;

#define int long long
#define endl "\n"

constexpr long long INF = (long long)1e18;
constexpr long long MOD = 1'000'000'007; 

string yn(bool f){return f?"Yes":"No";}
string YN(bool f){return f?"YES":"NO";}

#define x first
#define y second

signed main(){
	// cin.tie(nullptr);
	// ios::sync_with_stdio(false);
	// cout<<fixed<<setprecision(10);
	
	int N, cost = 0;
	vector<int> used;
	vector<pair<int,int>> p;
	// vector<pair<int,int>> p, cx, cy;
	set<pair<int,int>> cx, cy;
	priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> Q;
	
	cin>>N;
	
	p.resize(N);
	used.resize(N);
	// cx.resize(N);
	// cy.resize(N);
	
	for(int i = 0; i < N; i++){
		cin>>p[i].x>>p[i].y;
		
		if(i)cx.insert(make_pair(p[i].x, i));
		if(i)cy.insert(make_pair(p[i].y, i));
		// cy.insert({P[i].y, i});
	}
	
	for(int i = 1, now = 0; ; i++){
		int nx = p[now].x, ny = p[now].y;
		int next = 0, minimum = INF;
		
		used[now] = true;
		
		// cout<<"i = "<<i<<" now "<<now<<" nx = "<<nx<<" ny = "<<ny<<endl;
		
		// for(pair<int,int> p : cx){
			// cout<<"pxx : "<<p.first<<" "<<p.second<<endl; 
		// }
		// for(pair<int,int> p : cy){
			// cout<<"pyy : "<<p.first<<" "<<p.second<<endl; 
		// }
		
		if(cx.size() == 0) break;
		
		{
			auto itx = cx.lower_bound(make_pair(nx,-1)); 
			auto itx2 = itx;
			itx2--;
			
			// if(itx != cx.end() && (*itx).first - nx < minimum && !used[(*itx).second]) {
			if(itx != cx.end()  && !used[(*itx).second]) {
					// cout<<"X1[]  "<<(*itx).first<<" "<<(*itx).second<<endl;
					// minimum = (*itx).first - nx;
					// next = (*itx).second;
					Q.push({(*itx).first - nx, (*itx).second});
			}
			
			// if(itx != cx.begin() && nx - (*itx2).first < minimum && !used[(*itx2).second]) {
			if(itx != cx.begin()  && !used[(*itx2).second]) {
					// cout<<"X2[]  "<<(*itx2).first<<" "<<(*itx2).second<<endl;
					// minimum = nx - (*itx2).first;
					// next = (*itx2).second;
					Q.push({nx - (*itx2).first, (*itx2).second});
			}
		}
		
		{
			// auto itx = cy.lower_bound({ny,-1}); itx--;
			// auto itx2 = itx; itx++;
			auto itx = cy.lower_bound({ny,-1});
			auto itx2 = itx; itx2--;
			
			// if(itx != cy.end() && (*itx).first - ny < minimum && !used[(*itx).second]) {
			if(itx != cy.end()  && !used[(*itx).second]) {
					// cout<<"Y1[]  "<<(*itx).first<<" "<<(*itx).second<<endl;
					// minimum = (*itx).first - ny;
					// next = (*itx).second;
					Q.push({(*itx).first - ny, (*itx).second});
			}
			// if(itx != cy.begin() && ny - (*itx2).first < minimum && !used[(*itx2).second]) {
			if(itx != cy.begin()  && !used[(*itx2).second]) {
					// cout<<"Y2[]  "<<(*itx2).first<<" "<<(*itx2).second<<endl;
					// minimum = ny - (*itx2).first;
					// next = (*itx2).second;
					Q.push({ny - (*itx2).first, (*itx2).second});
			}
		}
		
		
		while(Q.size()) {
			minimum = Q.top().first;
			next = Q.top().second;
			Q.pop();
			if(used[next] == false) break;
		}
		// cout<<"minimum "<<minimum<<endl;
		
		cost += minimum;
		now = next;
		
		cx.erase(make_pair(p[next].x, next));
		cy.erase(make_pair(p[next].y, next));
	}
	
	cout<<cost<<endl;
	
	return 0;
}

Measured memory_bytes: 21232