# -*- coding: utf-8 -*-

import sys

from heapq import heappush,heappop,heapify



N=int(sys.stdin.readline().strip())

V=[]    #頂点の集合 (x座標、y座標、頂点番号)

for v in range(N):   #v:頂点番号

    x,y=tuple(map(int, sys.stdin.readline().split()))

    V.append((x,y,v+1))



#頂点をy軸でソート

V.sort(key=lambda x:(x[0]) )

E=[]    #辺の集合 (辺の長さ、頂点番号、頂点番号)

for i in range(N-1):

    fro_x,fro=V[i][0],V[i][2]

    to_x,to=V[i+1][0],V[i+1][2]

    E.append( (abs(fro_x-to_x),fro,to))



#頂点をx軸でソート

V.sort(key=lambda x:(x[1]) )

for i in range(N-1):

    fro_y,fro=V[i][1],V[i][2]

    to_y,to=V[i+1][1],V[i+1][2]

    E.append( (abs(fro_y-to_y),fro,to))



#辺の集合を辺の長さで昇順ソート

E.sort(key=lambda x:(x[0]) )



al=[[] for _ in range(N+1)]



for cost,fro,to in E:

    al[fro].append((cost,to))

    al[to].append((cost,fro))





#確定した頂点のリスト

fixed_v=[ 0 for _ in range(N+1) ]

hq=[]   #最短の辺を取得するためのヒープキュー

V=[1]   #次に処理する頂点が常に1つだけ入る、頂点1が常にスタート地点



ans=0

while V:

    cur=V.pop()

    #確定した頂点の更新

    fixed_v[cur]=1

    #頂点curから出て行く辺を全てhqに入れる

    for cost,to in al[cur]:

        heappush(hq,(cost,to))

    while hq:

        #hqから辺を取り出す

        cost,to=heappop(hq)

        #未確定の頂点が見つかれば、次に見る頂点としてVにappendし、whileループはbreak

        if fixed_v[to]==0:

            ans+=cost

            V.append(to)

            break

        #確定済みの頂点の場合は、#未確定の頂点が見つかるまでheapqからpopする



print(ans)
# -*- coding: utf-8 -*-

import sys

from heapq import heappush,heappop,heapify



N=int(sys.stdin.readline().strip())

V=[]    #頂点の集合 (x座標、y座標、頂点番号)

for v in range(N):   #v:頂点番号

    x,y=tuple(map(int, sys.stdin.readline().split()))

    V.append((x,y,v+1))



#頂点をy軸でソート

V.sort(key=lambda x:(x[0]) )

E=[]    #辺の集合 (辺の長さ、頂点番号、頂点番号)

for i in range(N-1):

    fro_x,fro=V[i][0],V[i][2]

    to_x,to=V[i+1][0],V[i+1][2]

    E.append( (abs(fro_x-to_x),fro,to))



#頂点をx軸でソート

V.sort(key=lambda x:(x[1]) )

for i in range(N-1):

    fro_y,fro=V[i][1],V[i][2]

    to_y,to=V[i+1][1],V[i+1][2]

    E.append( (abs(fro_y-to_y),fro,to))





al=[[] for _ in range(N+1)]

for cost,fro,to in E:

    al[fro].append((cost,to))

    al[to].append((cost,fro))





#確定した頂点のリスト

fixed_v=[ 0 for _ in range(N+1) ]

hq=[]   #最短の辺を取得するためのヒープキュー

V=[1]   #次に処理する頂点が常に1つだけ入る、頂点1が常にスタート地点



ans=0

while V:

    cur=V.pop()

    #確定した頂点の更新

    fixed_v[cur]=1

    #頂点curから出て行く辺を全てhqに入れる

    for cost,to in al[cur]:

        heappush(hq,(cost,to))

    while hq:

        #hqから辺を取り出す

        cost,to=heappop(hq)

        #未確定の頂点が見つかれば、次に見る頂点としてVにappendし、whileループはbreak

        if fixed_v[to]==0:

            ans+=cost

            V.append(to)

            break

        #確定済みの頂点の場合は、#未確定の頂点が見つかるまでheapqからpopする



print(ans)
# -*- coding: utf-8 -*-
import sys
from heapq import heappush, heappop, heapify

N = int(sys.stdin.readline().strip())
V = []  # 頂点の集合 (x座標、y座標、頂点番号)
for v in range(N):  # v:頂点番号
    x, y = tuple(map(int, sys.stdin.readline().split()))
    V.append((x, y, v + 1))
# 頂点をy軸でソート
V.sort(key=lambda x: (x[0]))
E = []  # 辺の集合 (辺の長さ、頂点番号、頂点番号)
for i in range(N - 1):
    fro_x, fro = V[i][0], V[i][2]
    to_x, to = V[i + 1][0], V[i + 1][2]
    E.append((abs(fro_x - to_x), fro, to))
# 頂点をx軸でソート
V.sort(key=lambda x: (x[1]))
for i in range(N - 1):
    fro_y, fro = V[i][1], V[i][2]
    to_y, to = V[i + 1][1], V[i + 1][2]
    E.append((abs(fro_y - to_y), fro, to))
# 辺の集合を辺の長さで昇順ソート
E.sort(key=lambda x: (x[0]))
al = [[] for _ in range(N + 1)]
for cost, fro, to in E:
    al[fro].append((cost, to))
    al[to].append((cost, fro))
# 確定した頂点のリスト
fixed_v = [0 for _ in range(N + 1)]
hq = []  # 最短の辺を取得するためのヒープキュー
V = [1]  # 次に処理する頂点が常に1つだけ入る、頂点1が常にスタート地点
ans = 0
while V:
    cur = V.pop()
    # 確定した頂点の更新
    fixed_v[cur] = 1
    # 頂点curから出て行く辺を全てhqに入れる
    for cost, to in al[cur]:
        heappush(hq, (cost, to))
    while hq:
        # hqから辺を取り出す
        cost, to = heappop(hq)
        # 未確定の頂点が見つかれば、次に見る頂点としてVにappendし、whileループはbreak
        if fixed_v[to] == 0:
            ans += cost
            V.append(to)
            break
        # 確定済みの頂点の場合は、#未確定の頂点が見つかるまでheapqからpopする
print(ans)

# -*- coding: utf-8 -*-
import sys
from heapq import heappush, heappop, heapify

N = int(sys.stdin.readline().strip())
V = []  # 頂点の集合 (x座標、y座標、頂点番号)
for v in range(N):  # v:頂点番号
    x, y = tuple(map(int, sys.stdin.readline().split()))
    V.append((x, y, v + 1))
# 頂点をy軸でソート
V.sort(key=lambda x: (x[0]))
E = []  # 辺の集合 (辺の長さ、頂点番号、頂点番号)
for i in range(N - 1):
    fro_x, fro = V[i][0], V[i][2]
    to_x, to = V[i + 1][0], V[i + 1][2]
    E.append((abs(fro_x - to_x), fro, to))
# 頂点をx軸でソート
V.sort(key=lambda x: (x[1]))
for i in range(N - 1):
    fro_y, fro = V[i][1], V[i][2]
    to_y, to = V[i + 1][1], V[i + 1][2]
    E.append((abs(fro_y - to_y), fro, to))
al = [[] for _ in range(N + 1)]
for cost, fro, to in E:
    al[fro].append((cost, to))
    al[to].append((cost, fro))
# 確定した頂点のリスト
fixed_v = [0 for _ in range(N + 1)]
hq = []  # 最短の辺を取得するためのヒープキュー
V = [1]  # 次に処理する頂点が常に1つだけ入る、頂点1が常にスタート地点
ans = 0
while V:
    cur = V.pop()
    # 確定した頂点の更新
    fixed_v[cur] = 1
    # 頂点curから出て行く辺を全てhqに入れる
    for cost, to in al[cur]:
        heappush(hq, (cost, to))
    while hq:
        # hqから辺を取り出す
        cost, to = heappop(hq)
        # 未確定の頂点が見つかれば、次に見る頂点としてVにappendし、whileループはbreak
        if fixed_v[to] == 0:
            ans += cost
            V.append(to)
            break
        # 確定済みの頂点の場合は、#未確定の頂点が見つかるまでheapqからpopする
print(ans)

-# 辺の集合を辺の長さで昇順ソート -E.sort(key=lambda x: (x[0]))