#include<bits/stdc++.h>
const int N = 1e5+5;
using namespace std;
int n;
struct Node{
	int x;
	int y;
	int id;
	void show(){
		cout << this->x <<" "<<this->y<<" "<<this->id<<"\n";
	}
}a[N];
bool cmp1(const Node &a, const Node &b){
	if(a.x < b.x) return 1;
	if(a.x == b.x) return a.y < b.y;
	return 0;
}
bool cmp2(const Node &a, const Node &b){
	if(a.y < b.y) return 1;
	if(a.x == b.x) return a.x < b.x;
	return 0;
}
struct cmpp{
	bool operator()(const Node &a, const Node &b){
		if(a.x > b.x) return 1;
		if(a.x == b.x) return a.y > b.y;
		return 0;
	}
};
priority_queue<tuple<int,int,int>, vector<tuple<int,int,int>>, greater<tuple<int,int,int>> > pq;

int counting;
vector<int> par, children;

void Start(int n){
	counting = n;
 	par.assign(n+1,-1);
	children.assign(n+1,1);
	for(int i = 1; i <= n; ++i){
		par[i] = i;
	}
	return;
}

int Find(int i){
	if(par[i] != i) par[i] = Find(par[i]);
	return par[i];
}

bool Union(int i, int j){
	i = Find(i);
	j = Find(j);
	if(i != j){
		if(children[i] < children[j]){
			par[i] = j;
			children[j] += children[i];	
		}else{
			par[j] = i;
			children[i] += children[j];
		}
		counting--;
	}else return 0;
	return 1;
}

signed main(){
	cin >> n;
	for(int i = 1; i <= n; ++i){
		cin >> a[i].x >> a[i].y;
		a[i].id = i; 
	}
	
	sort(a+1, a+1+n, cmp1);
	for(int i = 1; i <= n; ++i){
		if(i!=1) pq.push(make_tuple(abs(a[i].x - a[i-1].x), a[i].id, a[i-1].id));
	}

	sort(a+1, a+1+n, cmp2);
	for(int i = 1; i <= n; ++i){
		if(i!=1) pq.push(make_tuple(abs(a[i].y - a[i-1].y), a[i].id, a[i-1].id));
	}
	int ans = 0, dist, u, v;
	Start(n);
	while(pq.size()){
		if(counting == 1) break;
		tie(dist, u, v) = pq.top();
		pq.pop();
		if(Union(u, v)){ 
			ans += dist;
		}
	}
	cout << ans <<"\n";
}
