#include <bits/stdc++.h>
using namespace std;
struct punct {
  int x, y, poz;
};
punct v[100010], v1[100010];
int vaz[100010];
map<pair<int, int>, char> vaz1;
int cmp1(punct a, punct b) { return a.x < b.x; }
int cmp2(punct a, punct b) { return a.y < b.y; }
int cmp3(punct a, punct b) { return a.poz < b.poz; }
int main() {
  int n;
  long long sol = 0;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &v[i].x, &v[i].y);
    v[i].poz = i;
  }
  int l = 0;
  sort(v + 1, v + n + 1, cmp1);
  for (int i = 1; i < n; i++)
    v1[++l] = {v[i].poz, v[i + 1].poz, v[i + 1].x - v[i].x};
  sort(v + 1, v + n + 1, cmp2);
  for (int i = 1; i < n; i++)
    v1[++l] = {v[i].poz, v[i + 1].poz, v[i + 1].y - v[i].y};
  sort(v1 + 1, v1 + l + 1, cmp3);
  int c = 1;
  for (int i = 1; i <= l; i++) {
    if (vaz[v1[i].x] == 0 && vaz[v1[i].y] == 0) {
      sol += v1[i].poz;
      vaz[v1[i].x] = vaz[v1[i].y] = c;
      c++;
    } else if (vaz[v1[i].x] != 0 && vaz[v1[i].y] != 0 &&
               vaz[v1[i].x] != vaz[v1[i].y]) {
      if (vaz1[{vaz[v1[i].x], vaz[v1[i].y]}] == 0) {
        sol += v1[i].poz;
        vaz1[{vaz[v1[i].x], vaz[v1[i].y]}] =
            vaz1[{vaz[v1[i].y], vaz[v1[i].x]}] = 1;
      }
    } else if (vaz[v1[i].x] != 0 && vaz[v1[i].y] == 0) {
      sol += v1[i].poz;
      vaz[v1[i].y] = vaz[v1[i].x];
    } else if (vaz[v1[i].y] != 0 && vaz[v1[i].x] == 0) {
      sol += v1[i].poz;
      vaz[v1[i].x] = vaz[v1[i].y];
    }
  }
  printf("%lld", sol);
  return 0;
}
