/*  Success may not come to me immediately,
 *  but it will come definitely....
 */
#include<bits/stdc++.h>
//=====================================================================
using namespace std;
//=====================================================================
#define opt ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
//=====================================================================
#define li  int64_t
#define ld  double_t
#define ulli    uint64_t
//=====================================================================
#define rep(i,a,b)  for(i=a;i<b;i++)
#define repr(i,a,b) for(i=a;i>b;i--)
#define repi(i,v)   for(i=v.begin();i!=v.end();i++)
#define elif        else if
#define mset(a,b)   memset(a,b,sizeof(a))
#define nl      cout<<'\n'
//=====================================================================
typedef vector<li>       vli;
typedef vector<string>   vstr;
typedef pair<li,li>      pli;
typedef pair<li,pli >    ppli;
typedef pair<li,ppli >   pppli;
typedef vector<pli >     vpl;
typedef vector<ppli >    vppli;
typedef vector<pppli >   vpppli;
//=====================================================================
#define pb  push_back
#define pob pop_back
#define pf  push_front
#define pof pop_front
#define all(v)  v.begin(),v.end()
#define itr iterator
#define sz  size()
#define lb  lower_bound
#define ub  upper_bound
#define bs  binary_search
#define mp  make_pair
#define F   first
#define S   second
//=====================================================================
#define mod (li)(1e9+7)
#define inf (li)(1e18)
#define MX1 (li)(1e5+5)
#define MX2 (li)(1e6+5)
#define pi  acos(-1)
//=====================================================================
li power(li a,li b){li ans=1;while(b){if(b&1){ans=(ans*a)%mod;}
a=(a*a)%mod;b>>=1;}return ans;}
//=====================================================================
li mmi(li n){return power(n,mod-2);}
//=====================================================================
li two(li n){return 1<<n;}
//=====================================================================
void onbit(li &n,li x){n|=two(x);}
//=====================================================================
void offbit(li &n,li x){n&=~two(x);}
//=====================================================================
li cntbit(li n){li res=0;while(n and ++res)n-=n&-n;return res;}
//=====================================================================
li dx[]={-1,0,1,0},dy[]={0,-1,0,1};
//=====================================================================
/*------------------------MAIN CODE BEGINS NOW!------------------------*/

li x[MX1],y[MX1],vis[MX1];
vpl xc,yc,g[MX1];

li prims(li s){
    priority_queue<pli,vpl,greater<pli> > pq;
    pq.push(mp(0,s));
    li i,mincost=0;
    while(!pq.empty()){
        pli p=pq.top();
        pq.pop();
        if(vis[p.S]) continue;
        mincost+=p.F;
        vis[p.S]=1;
        rep(i,0,g[p.S].sz){
            if(!vis[g[p.S][i].F]){
                pq.push(mp(g[p.S][i].S,g[p.S][i].F));
            }
        }
    }
    return mincost;
}

void solve(){
    li i,n;cin>>n;
    rep(i,0,n){
        cin>>x[i]>>y[i];
    }
    rep(i,0,n){
        xc.pb(mp(x[i],i));
        yc.pb(mp(y[i],i));
    }
    sort(all(xc));
    sort(all(yc));
    rep(i,1,n){
        g[xc[i].S].pb(mp(xc[i-1].S,xc[i].F-xc[i-1].F));
        g[xc[i-1].S].pb(mp(xc[i].S,xc[i].F-xc[i-1].F));
        g[yc[i].S].pb(mp(yc[i-1].S,yc[i].F-yc[i-1].F));
        g[yc[i-1].S].pb(mp(yc[i].S,yc[i].F-yc[i-1].F));
    }
    li ans=prims(1);
    cout<<ans;
}

int main(){
    opt
//    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    li t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

Measured memory_bytes: 19684