#include <bits/stdc++.h>

using namespace std;
#define inputInt(a) int a; cin >> a; 
#define inputInt2(a,b) int a; int b; cin >> a >> b; 
#define inputInt3(a,b,c) int a; int b; int c; cin >> a >> b >> c;
#define inputLong(a) long a;cin >> a;
#define inputIntArray(a,N) int a[N];for(int i=0;i<N;i++){cin >> a[i];}
#define inputLongArray(a,N) long a[N];for(int i=0;i<N;i++){cin >> a[i];}
#define inputDoubleArray(a,N) double a[N];for(int i=0;i<N;i++){cin >> a[i];}
#define inputIntArray2(a,b,N) int a[N]; int b[N]; for(int i=0;i<N;i++){cin >> a[i] >> b[i];}
#define output(answer) cout << answer << endl;
#define fN(i,N)    for(int i=0; i<N; i++)
#define fSE(i,s,e) for(int i=s; i<=e; i++)
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }

bool compare_by_first(pair<int,pair<int,int>> p, pair<int,pair<int,int>> q){
  if(p.second.first != q.second.first){
    return p.second.first < q.second.first; 
  }else{
    return p.second.second < q.second.second; 
  }
}

bool compare_by_second(pair<int,pair<int,int>> p, pair<int,pair<int,int>> q){
  if(p.second.second != q.second.second){
    return p.second.second < q.second.second; 
  }else{
    return p.second.first < q.second.first;
  }
}

////////////////////////////////////////////////////////////////////////////////

class UnionFind {
  vector<int> parent;
  vector<int> rank;
  
  public:
  
  UnionFind(int N);
  int root(int x);
  void unite(int x, int y);
  bool isUnited(int x, int y);
  int getRank(int x);
};

UnionFind::UnionFind(int N):parent(N),rank(N,1){
  for(int i=0; i<N; i++){parent[i]=i;}
}
  
int UnionFind::root(int x){
  if(parent[x] == x){
    return x;
  }else{
    if(parent[x]!=parent[parent[x]]) rank[x]-=1;
    return parent[x] = root(parent[x]);
  }
  //parent[x] = parent[parent[x]];
  
}
  
void UnionFind::unite(int x, int y) { // xとyの木を併合
  int rx = root(x); //xの根をrx
  int ry = root(y); //yの根をry
  if (rx == ry) return; //xとyの根が同じ(=同じ木にある)時はそのまま
  
  if(rank[x] >= rank[y]){parent[ry] = rx; rank[y]+=1;}//大きい木に小さい木が併合される
  else{parent[rx] = ry; rank[x]+=1;}//根に直接辺を張る
}
  
bool UnionFind::isUnited(int x, int y) { // 2つのデータx, yが属する木が同じならtrueを返す
  int rx = root(x);
  int ry = root(y);
  parent[x] = rx; parent[y] = ry;
  rank[x]=2;rank[y]=2;
  return rx == ry;
}

int UnionFind::getRank(int x){
  return rank[x];
}

////////////////////////////////////////////////////////////////////////////////

int main(){
  
  long long int ans = 0;
  
  
  //input
  int N;
  cin >> N;
  vector< pair< int, pair<int,int> > > city(N);
  for(int i=0; i<N; i++){
    int x,y;
    cin >> x >> y;
    city[i].first = i;
    city[i].second.first = x;
    city[i].second.second = y;
  }
  
  //グラフの準備
  vector<vector<pair<int,int>>> g(N); //g[from](to,cost) 
  //注意。最初のベクトルはノードのベクトル。2番目のベクトルは辺のベクトル。
  
  
  //まずは辺を張る。全域最小木の候補としてはx・y座標でソートしたものだけを見れば良い。
  sort(city.begin(), city.end(), compare_by_first);//街のx座標でソート。
  for(int i=0; i<N-1; i++){//i番目の街とi+1番目の街の間に辺を張る。
    g[city[i].first].push_back(make_pair(city[i+1].first,city[i+1].second.first-city[i].second.first) );
    //i+1番目にx座標が小さい街
  }
      
  sort(city.begin(), city.end(), compare_by_second);//街のy座標でソート。
  for(int i=0; i<N-1; i++){//i番目の街とi+1番目の街の間に辺を張る。
    g[city[i].first].push_back(make_pair(city[i+1].first,city[i+1].second.second-city[i].second.second) );
    //i+1番目にy座標が小さい街
  }
    
  //main クラスカル法
  //
  UnionFind tree(N);
  
  vector< pair<int, pair<int,int> > > edges;
  
  
  
  for(int i=0; i<N; i++){
    for(auto e:g[i]){//eはpair型
      //output(e.first); //toが出てくる。
      edges.push_back( make_pair(i, e) );//辺だけの集合ができた。
    } 
  }
  
  sort(edges.begin(), edges.end(), compare_by_second);//辺のコストが小さい順にソート
  
  for(int i=0; i<edges.size(); i++){
    if(!tree.isUnited(edges[i].first, edges[i].second.first)){
      //最小辺のfromとtoが連結でない時
      tree.unite(edges[i].first, edges[i].second.first);
      ans += edges[i].second.second;
    }
  }
  
  output(ans);
  
  //プリム法
  //任意の頂点をひとつ加える。最小辺を加える。
  //for(int i=0;)
  
  return 0; 
}

Measured memory_bytes: 12404