8074
#include<bits/stdc++.h>
using namespace std;
int n,t,fa[100010],num,ans;
struct rec{
int x,y,z,opt;
}a[100010];
struct node{
int x1,y1,w;
}edge[1000010];
bool cmpw(node a,node b){
return a.w<b.w;
}
bool cmpx(rec a,rec b){
return a.x<b.x;
}
bool cmpy(rec a,rec b){
return a.y<b.y;
}
bool cmpz(rec a,rec b){
return a.z<b.z;
}
int get(int x){
if(x==fa[x])return x;
return x=get(fa[x]);
}
void add(int x,int y,int w){
edge[++num].x1=x;
edge[num].y1=y;
edge[num].w=w;
}
void curuscl(){
for(int i=1;i<=n;i++)fa[i]=i;
int k=0;
sort(edge+1,edge+num+1,cmpw);
for(int i=1;i<=n;i++){
int x=get(edge[i].x1),y=get(edge[i].y1);
if(x!=y){
fa[x]=y;
ans+=edge[i].w;
k++;
}
if(k==n-1)
return;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].z;
a[i].opt=i;
}
sort(a+1,a+1+n,cmpx);
for(int i=1;i<=n-1;i++)
add(a[i].opt,a[i+1].opt,a[i+1].x-a[i].x);
sort(a+1,a+1+n,cmpy);
for(int i=1;i<=n-1;i++)
add(a[i].opt,a[i+1].opt,a[i+1].y-a[i].y);
sort(a+1,a+1+n,cmpz);
for(int i=1;i<=n-1;i++)
add(a[i].opt,a[i+1].opt,a[i+1].z-a[i].z);
curuscl();
cout<<ans;
return 0;
}