#include <bits/stdc++.h>
using namespace std;
int p[100010];
struct node {
  int x, y, id;
} nodes[100010];
struct edge {
  int u, v, cost;
} mst[100010];
int find(int u) {
  if (p[u] == u)
    return p[u];
  else
    return p[u] = find(p[u]);
}
bool cmp1(node &a, node &b) { return a.x < b.x; }
bool cmp2(node &a, node &b) { return a.y < b.y; }
bool cmp3(edge &a, edge &b) { return a.cost < b.cost; }
int main() {
  int n, k = 0;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> nodes[i].x >> nodes[i].y;
    nodes[i].id = i;
  }
  sort(nodes + 1, nodes + 1 + n, cmp1);
  for (int i = 1; i <= n - 1; i++) {
    mst[k].u = nodes[i].id;
    mst[k].v = nodes[i + 1].id;
    mst[k].cost = abs(nodes[i].x - nodes[i + 1].x);
    k++;
  }
  sort(nodes + 1, nodes + 1 + n, cmp2);
  for (int i = 1; i <= n - 1; i++) {
    mst[k].u = nodes[i].id;
    mst[k].v = nodes[i + 1].id;
    mst[k].cost = abs(nodes[i].y - nodes[i + 1].y);
    k++;
  }
  sort(mst, mst + k, cmp3);
  for (int i = 0; i <= n; i++) {
    p[i] = i;
  }
  long long ans = 0;
  for (int i = 0; i < k; i++) {
    int a = mst[i].u, b = mst[i].v;
    a = find(a), b = find(b);
    if (a != b) {
      ans += mst[i].cost;
      p[a] = b;
    }
  }
  cout << ans;
}
