using System;
using System.Collections.Generic;
using System.Linq;

namespace ABC065D
{
    class Program
    {
        static void Main(string[] args)
        {
            var N = int.Parse(Console.ReadLine());

            memo[] x = new memo[N];
            memo[] y = new memo[N];
            for (int i = 0; i < N; i++)
            {
                var input = ReadLong();
                x[i] = new memo() { town = i, point = input[0] };
                y[i] = new memo() { town = i, point = input[1] };
            }

            //ソート
            x = x.OrderBy(a => a.point).ToArray();
            y = y.OrderBy(a => a.point).ToArray();

            Edge[] edgesx = new Edge[N - 1];
            Edge[] edgesy = new Edge[N - 1];
            for (int i = 0; i < N - 1; i++)
            {
                edgesx[i] = new Edge() { s = x[i].town, t = x[i + 1].town, cost = x[i + 1].point - x[i].point };
                edgesy[i] = new Edge() { s = y[i].town, t = y[i + 1].town, cost = y[i + 1].point - y[i].point };
            }

            Edge[] edges = edgesx.Concat(edgesy).ToArray();
            edges = edges.OrderBy(a => a.cost).ToArray();

            UnionFind unionFind = new UnionFind(N);

            long ans = 0;   //最小コスト
            foreach (var e in edges)
            {
                //結合済みでないなら追加
                if (!unionFind.Same(e.s, e.t))
                {
                    unionFind.Unite(e.s, e.t);
                    ans += e.cost;
                }
            }

            Console.WriteLine(ans);
            Console.ReadKey();
        }


        struct Edge
        {
            public int s;
            public int t;
            public long cost;
        }

        struct memo
        {
            public int town;
            public long point;
        }

        static int[] ReadInt()
        {
            int[] ret = Console.ReadLine().Split().Select(int.Parse).ToArray();
            return ret;
        }
        static long[] ReadLong()
        {
            long[] ret = Console.ReadLine().Split().Select(long.Parse).ToArray();
            return ret;
        }
    }


    class UnionFind
    {
        int[] par;
        int[] rank;

        public UnionFind(int n)
        {
            init(n);
        }

        void init(int n)
        {
            par = new int[n];
            rank = new int[n];

            for (int i = 0; i < n; i++)
            {
                par[i] = i;
                rank[i] = 0;
            }
        }

        public int Find(int x)
        {
            if (par[x] == x)
            {
                return x;
            }
            else
            {
                return par[x] = Find(par[x]);
            }
        }

        public void Unite(int x, int y)
        {
            x = Find(x);
            y = Find(y);
            if (x == y) return;

            if (rank[x] < rank[y])
            {
                par[x] = y;
            }
            else
            {
                par[y] = x;
                if (rank[x] == rank[y]) rank[x]++;
            }

        }
        public bool Same(int x, int y)
        {
            return Find(x) == Find(y);
        }
    }
}


Measured memory_bytes: 43308