using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProCon
{

    class Program
    {

        static void Main(string[] args)
        {
            int num = int.Parse(Console.ReadLine());

            List<TwoNums> listX = new List<TwoNums>();
            List<TwoNums> listY = new List<TwoNums>();

            for (int i = 0; i < num; ++i)
            {
                string[] input = Console.ReadLine().Split(' ');
                listX.Add(new TwoNums(i, int.Parse(input[0])));
                listY.Add(new TwoNums(i, int.Parse(input[1])));
            }
            listX.Sort((a, b) => a.Value2 - b.Value2);
            listY.Sort((a, b) => a.Value2 - b.Value2);
            Graph graph = new Graph(num);
            for (int i = 0; i < num - 1; ++i)
            {
                graph.AddLine(listX[i].Value1, listX[i + 1].Value1, listX[i + 1].Value2 - listX[i].Value2);
                graph.AddLine(listY[i].Value1, listY[i + 1].Value1, listY[i + 1].Value2 - listY[i].Value2);
            }
            Console.WriteLine(graph.GetMinimamAllTree());
        }
    }
    struct TwoNums
    {
        public TwoNums(int n, int m)
        {
            Value1 = n;
            Value2 = m;
        }
        public int Value1 { get; private set; }
        public int Value2 { get; private set; }
    }
    class Graph
    {
        struct Line
        {
            public Line(int i1, int i2, int cost)
            {
                Index1 = i1;
                Index2 = i2;
                Cost = cost;
            }
            public int Index1{ get; private set; }
            public int Index2{ get; private set; }
            public int Cost { get; private set; }
            
        }
        public Graph(int nodesNum)
        {
            Lines = new List<Line>();
            NodesNum = nodesNum;
        }
        public void MakeNodes(int num)
        {
            NodesNum = num;
        }
        public void AddLine(int i1, int i2, int cost)
        {
            Lines.Add(new Line(i1, i2, cost));
        }
        public int GetMinimamAllTree()
        {
            int[] IdxToGroup = new int[NodesNum];
            List<int>[] GroupToIdx = new List<int>[NodesNum];
            for (int i = 0; i < NodesNum; ++i)
            {
                IdxToGroup[i] = i;
                GroupToIdx[i] = new List<int>();
                GroupToIdx[i].Add(i);
            }
            int ConnectNum = 0;
            int cost = 0;
            Lines.Sort((a,b)=>a.Cost - b.Cost);
            for( int i=0;i<Lines.Count;++i)
            {
                if(IdxToGroup[Lines[i].Index1] != IdxToGroup[Lines[i].Index2])
                {
                    cost += Lines[i].Cost;
                    ConnectNum++;
                    if ( ConnectNum >= NodesNum - 1)
                    {
                        return cost;
                    }
                    int minGroup = Math.Min(IdxToGroup[Lines[i].Index1], IdxToGroup[Lines[i].Index2]);
                    int maxGroup = Math.Max(IdxToGroup[Lines[i].Index1], IdxToGroup[Lines[i].Index2]);
                    GroupToIdx[minGroup].InsertRange(0, GroupToIdx[maxGroup]);
                    for(int j=0;j< GroupToIdx[maxGroup].Count; ++j)
                    {
                        IdxToGroup[GroupToIdx[maxGroup][j]] = minGroup;
                    }
                    GroupToIdx[maxGroup].Clear();
                } 
            }
            return -1;
        }
        int NodesNum;
        List<Line> Lines;
    }
}

Measured memory_bytes: 40332