#include <bits/stdc++.h>
using namespace std;
int par[100005];
int ran[100005];
void init(int n) {
  for (int i = 0; i < n; i++) {
    par[i] = i;
    ran[i] = 0;
  }
}
int finds(int x) {
  if (par[x] == x) {
    return (x);
  } else {
    return (par[x] = finds(par[x]));
  }
}
void unite(int x, int y) {
  x = finds(x);
  y = finds(y);
  if (x == y) return;
  if (ran[x] < ran[y]) {
    par[x] = y;
  } else {
    par[y] = x;
    if (ran[x] == ran[y]) ran[x]++;
  }
}
bool same(int x, int y) { return finds(x) == finds(y); }
struct edge {
  int u;
  int v;
  int cost;
};
bool comp(const edge &e1, const edge &e2) { return e1.cost < e2.cost; }
int kruskal(int V, int E, edge es[]) {
  sort(es, es + E, comp);
  init(V);
  int res = 0;
  for (int i = 0; i < E; i++) {
    edge e = es[i];
    if (!same(e.u, e.v)) {
      unite(e.u, e.v);
      res += e.cost;
    }
  }
  return res;
}
int sig(int V) {
  int i;
  int ans = 0;
  for (i = 1; i < V; i++) {
    ans = ans + i;
  }
  return (ans);
}
int costen(pair<int, int> a, pair<int, int> b) {
  return min(fabs(a.first - b.first), fabs(a.second - b.second));
}
int main(void) {
  int V;
  vector<pair<int, int>> xy;
  int i, k;
  int j = 0;
  int e, temp1, temp2;
  edge es[20000];
  cin >> V;
  for (i = 0; i < V; i++) {
    cin >> temp1 >> temp2;
    xy.push_back(make_pair(temp1, temp2));
  }
  e = sig(V);
  for (i = 0; i < V; i++) {
    for (k = i + 1; k < V; k++) {
      es[j].u = i;
      es[j].v = k;
      es[j].cost = costen(xy[i], xy[k]);
      j++;
    }
  }
  cout << kruskal(V, e, es) << endl;
  return (0);
}
