class UnionFind:
    def __init__(self, size):
        # 負の値はルート (集合の代表) で集合の個数
        # 正の値は次の要素を表す
        self.table = [-1 for _ in range(size)]

    # 集合の代表を求める
    def find(self, x):
        if self.table[x] < 0:
            return x
        else:
            # 経路の圧縮
            self.table[x] = self.find(self.table[x])
            return self.table[x]

    # 併合
    def union(self, x, y):
        s1 = self.find(x)
        s2 = self.find(y)
        if s1 != s2:
            if self.table[s1] <= self.table[s2]:
                # 小さいほうが個数が多い
                self.table[s1] += self.table[s2]
                self.table[s2] = s1
            else:
                self.table[s2] += self.table[s1]
                self.table[s1] = s2
            return True
        return False

    # 部分集合とその要素数を返す
    def subsetall(self):
        a = []
        for i in xrange(len(self.table)):
            if self.table[i] < 0:
                a.append((i, -self.table[i]))
        return a


N=int(input())
x=[]
y=[]
for i in range(N):
  a,b=map(int,input().split())
  x+=[ a]
  y+=[ b]
costs=[]
for i in range(N):
  for j in range(i):
    costs+=[(min(abs(x[i]-x[j]),abs(y[i]-y[j])),i,j)]
costs.sort()

S=0#既に引かれた線の本数
ans=0
s=UnionFind(N)
S=0
while S<N-1:#N-1本効率よく引けば、終わり。
  for cost in costs:
    #もしcost[1]とcost[2]が同じ連結成分に入っていたら、飛ばす。
    #入っていなかったら、ansにcost[0]を追加し、cost[2]の集合はcost[1]に合併し、S+=1する.
    if S==N-1:
      break
    if s.find(cost[1])!=s.find(cost[2]):
      ans+=cost[0]
      s.union(cost[1],cost[2])
      S+=1
print(ans)
    
    