#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

const LL maxn=100500,inf=LONG_LONG_MAX;
LL x[maxn],y[maxn],Map[maxn][maxn],vis[maxn],ans,n,d[maxn];
struct node
{
    LL v,len;//v代表当前顶点，w代表v到答案集合的最小距离
    friend bool operator <(node a,node b)
    {
        return a.len>b.len;
    }
};
LL prim()
{
    priority_queue<node>q;
    node t;
    t.v=1;t.len=0;
    q.push(t);//初始化顶点1到答案集合的距离为0，以保证第一次一定选入顶点1到答案集合中去
    ans=0;
    fill(vis,vis+maxn,0);
    fill(d,d+maxn,inf);
    while(q.size())
    {
        t=q.top();q.pop();//取离答案集合距离最小的顶点
        if(vis[t.v]) continue;//如果已经在答案集合中则进行下一次的循环
        vis[t.v]=1;//否则取顶点t.v加入到答案集合中
        ans+=t.len;
        for(int i=1;i<=n;i++)//更新未加入答案集合的顶点到答案集合 的距离
        {
            if(!vis[i]&&Map[t.v][i]<d[i])//可以更新则入队
            {
                node next;
                next.v=i;
                next.len=Map[t.v][i];
                d[i]=Map[t.v][i];
                q.push(next);
            }
        }
    }
    return ans;
}
int main()
{
    cin.sync_with_stdio(0);
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
                cin>>x[i]>>y[i];
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                Map[i][j]=min(abs(x[i]-x[j]),abs(y[i]-y[j]));
        cout<<prim()<<endl;
    }
    return 0;
}

