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

namespace UnionFind
{

    public class Sample
    {
        public class UnionFind{
            List<int> par;
            List<int> sizes;

            public UnionFind(int n){
                par = new List<int>();
                sizes = new List<int>();
                for(int i = 0; i < n; i++){
                    par.Add(i);
                    sizes.Add(1);
                }
            }

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

            public void Unite(int x, int y){
                x = Find(x);
                y = Find(y);
                if(x == y) return;
                if(sizes[x] < sizes[y]){
                    int tmp = x;
                    x = y;
                    y = tmp;
                }
                par[y] = x;
                sizes[x] += sizes[y];
            }

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

            public int size(int x){
                return sizes[Find(x)];
            }
        }

        public struct Edge
        {
            public int a, b, cost;
            public Edge(int a, int b, int cost){
                this.a = a;
                this.b = b;
                this.cost = cost;
            }
        }

        public class Graph
        {
            public Graph(){
                es = new List<Edge>();
            }

            public int n;
            public List<Edge> es;

            public int Kruskal()
            {
                es.Sort((a, b) => a.cost - b.cost);

                UnionFind uf = new UnionFind(n);
                int min_cost = 0;
                foreach(var e in es){
                    if(!uf.Same(e.a,e.b)){
                        min_cost += e.cost;
                        uf.Unite(e.a,e.b);
                    }
                }

                return min_cost;
            }
        }

        public static Graph Input_Graph(){
            Graph g = new Graph();
            
            int[] c = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
            g.n = c[0];
            int m = c[1];
            for(int i = 0; i < m; i++){
                int[] k = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
                g.es.Add(new Edge(k[0],k[1],k[2]));
            }
            return g;
        }

        public struct Node{
            public int i,x,y;
            public Node(int i, int x, int y){
                this.i = i;
                this.x = x;
                this.y = y;
            }
        }
        public static void Main(string[] args){
            // Graph g = Input_Graph();
            // Graph g = new Graph();
            // int n = Convert.ToInt32(Console.ReadLine());
            // g.n = n;
            // var nodes = new List<Node>();
            // for(int i = 0; i < n; i++){
            //     var c = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
            //     nodes.Add(new Node(i,c[0],c[1]));
            // }
            // nodes.Sort((a,b) => a.x.CompareTo(b.x));
            // for(int i = 0; i < n-1; i++){
            //     Edge e = new Edge(nodes[i].i, nodes[i+1].i,Math.Abs(nodes[i+1].x-nodes[i].x));
            //     g.es.Add(e);
            // }

            // nodes.Sort((a,b) => a.y.CompareTo(b.y));
            // for(int i = 0; i < n-1; i++){
            //     Edge e = new Edge(nodes[i].i, nodes[i+1].i,Math.Abs(nodes[i+1].y-nodes[i].y));
            //     g.es.Add(e);
            // }
            Graph g = new Graph();
            g.n = int.Parse(Console.ReadLine());
            var nodes = new List<Node>();
            for(int i = 0; i < g.n; i++){
                int[] k = Console.ReadLine().Split().Select(x => int.Parse(x)).ToArray();
                nodes.Add(new Node(i, k[0],k[1]));
            }
            nodes.Sort((a,b) => a.x - b.x);
            for(int i = 0; i < g.n - 1; i++){
                g.es.Add(new Edge(nodes[i].i, nodes[i+1].i,Math.Abs(nodes[i].x - nodes[i+1].x)));
            }
            nodes.Sort((a,b) => a.y - b.y);
            for(int i = 0; i < g.n - 1; i++){
                g.es.Add(new Edge(nodes[i].i, nodes[i+1].i,Math.Abs(nodes[i].y - nodes[i+1].y)));
            }
            Console.WriteLine(g.Kruskal());
        }
    }
}

Measured memory_bytes: 28196