// Slower C++ solution:
#include <bits/stdc++.h>

using namespace std;

#define ll long long

struct p {

	int x, y;

	int indx;

};

const int N = 1e5 + 5;

p points[N];

int n;

int par[N];

int get(int n) {

	if (par[n] == n) return n;

	return par[n] = get(par[n]);

}

vector<int> g[N];

void solve() {

	for (int i = 0; i < N; i++)

		par[i] = i;

	vector<pair<int, pair<int, int> >> edg;

	for (int i = 0; i < n; i++) {

//		g[i].clear();

//		g[i].resize(n);

		for (int j = 0; j < g[i].size(); j++) {

//			g[i][j] = j;

			int v = g[i][j];

			ll c = min(abs(points[i].x - points[v].x),

					abs(points[i].y - points[v].y));

			edg.push_back(make_pair(c, make_pair(i, v)));

		}

	}

	sort(edg.begin(), edg.end());

	ll ans = 0;

	for (int i = 0; i < edg.size(); i++) {

		int u = edg[i].second.first;

		int v = edg[i].second.second;

		int r1 = get(u);

		int r2 = get(v);

		if (r1 == r2) continue;

		//cout << u << "  " << v << endl;

		ans += edg[i].first;

		par[r1] = r2;

	}

	cout << ans << endl;

}

void gen(vector<pair<int, int> > &a, vector<pair<int, int> > &b) {



	sort(b.begin(), b.end());



	for (int i = 0; i < a.size(); i++) {



		auto it = lower_bound(b.begin(), b.end(), make_pair(a[i].first, -1));

		if (it != b.end()) {

			g[a[i].second].push_back(it->second);

			g[it->second].push_back(a[i].second);

		}

		if (it != b.begin()) {

			it--;



			g[a[i].second].push_back(it->second);

			g[it->second].push_back(a[i].second);

		}

	}

}

int main() {

	ios_base::sync_with_stdio(0);

	cin.tie(0);

	cin >> n;

	vector<pair<int, pair<int, int> > > v;

	for (int i = 0; i < n; i++) {

		cin >> points[i].x >> points[i].y;

		points[i].indx = i;

		v.push_back(make_pair(points[i].x, make_pair(points[i].y, i)));

	}

	sort(v.begin(), v.end());

	vector<pair<int, int> > last, cur;

	for (int i = 0; i < n;) {

		int X = v[i].first;

		while (i < n && v[i].first == X) {

			cur.push_back(v[i].second);

			i++;

		}

		if (last.size()) gen(last, cur);

		last = cur;

		cur.clear();

	}

	for (int i = 0; i + 1 < n; i++) {

		int u = v[i].second.second;

		int V = v[i + 1].second.second;

		g[u].push_back(V);

		g[V].push_back(u);

	}

	for (int i = 0; i < n; i++)

		swap(v[i].first, v[i].second.first);

	last.clear();

	sort(v.begin(), v.end());

	for (int i = 0; i < n;) {

		int X = v[i].first;



		while (i < n && v[i].first == X) {

			cur.push_back(v[i].second);

			i++;

		}

		if (last.size()) gen(last, cur);

		last = cur;

		cur.clear();

	}

	for (int i = 0; i + 1 < n; i++) {

		int u = v[i].second.second;

		int V = v[i + 1].second.second;

		g[u].push_back(V);

		g[V].push_back(u);

	}



	solve();

	return 0;

}


// Faster C++ solution for the same problem (measured speedup: 3.9721251828480515x):
#include <bits/stdc++.h>

using namespace std;

//#define cerr if (false) cerr

#define db(x) cerr << #x << "=" << x << endl

#define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl

#define db3(x, y, z) cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z << endl

#define dbv(v) cerr << #v << "="; for (auto _x : v) cerr << _x << ", "; cerr << endl

#define dba(a, n) cerr << #a << "="; for (int _i = 0; _i < (n); ++_i) cerr << a[_i] << ", "; cerr << endl

template <typename A, typename B>

ostream& operator<<(ostream& os, const pair<A, B>& x) {

	return os << "(" << x.first << "," << x.second << ")";

}

typedef long long ll;

typedef long double ld;

int main() {

	int n;

	scanf("%d", &n);

	vector<int> X(n), Y(n), id(n);

	for (int i = 0; i < n; ++i) {

		scanf("%d%d", &X[i], &Y[i]);

		id[i] = i;

	}

	vector<pair<int, pair<int, int>>> edges;

	sort(id.begin(), id.end(), [&](int a, int b) {

		return X[a] < X[b];

	});

	for (int i = 0; i + 1 < n; ++i) {

		edges.push_back({min(abs(X[id[i]] - X[id[i + 1]]), abs(Y[id[i]] - Y[id[i + 1]])), {id[i], id[i + 1]}});

	}

	sort(id.begin(), id.end(), [&](int a, int b) {

		return Y[a] < Y[b];

	});

	for (int i = 0; i + 1 < n; ++i) {

		edges.push_back({min(abs(X[id[i]] - X[id[i + 1]]), abs(Y[id[i]] - Y[id[i + 1]])), {id[i], id[i + 1]}});

	}

	sort(edges.begin(), edges.end());

	vector<int> par(n);

	iota(par.begin(), par.end(), 0);

	function<int(int)> getRoot = [&](int a) {

		if (par[a] == a) return a;

		return par[a] = getRoot(par[a]);

	};

	ll ans = 0;

	for (int i = 0; i < edges.size(); ++i) {

		int a, b;

		tie(a, b) = edges[i].second;

		int pa = getRoot(a), pb = getRoot(b);

		if (pa == pb) continue;

		par[pa] = pb;

		ans += edges[i].first;

	}

	printf("%lld\n", ans);

}