#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int n,m;
int dis(int x,int y,int z,int x2,int y2,int z2){
return min(abs(x-x2),min(abs(y-y2),abs(z-z2)));
}
struct planet{
int x,y,z,id;
}p[N];
struct edge{
int from;
int to;
int w;
}e[N];
bool cmpx(planet a,planet b){
return a.x<b.x;
}
bool cmpy(planet a,planet b){
return a.y<b.y;
}
bool cmpz(planet a,planet b){
return a.z<b.z;
}
bool cmp(edge a,edge b){
return a.w<b.w;
}
int s[N];
int find_set(int x){
if (x!=s[x]){
s[x]=find_set(s[x]);
}
return s[x];
}
void Kruskal(){
sort(e+1,e+1+m,cmp);
for (int i=1;i<=n;i++) s[i]=i;
int ans=0;
for (int i=1;i<=m;i++){
int e1=find_set(e[i].from);
int e2=find_set(e[i].to);
if (e1==e2) continue;
ans+=e[i].w;
s[e1]=e2;
}
cout<<ans;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
for (int i=1;i<=n;i++){
cin>>p[i].x>>p[i].y>>p[i].z;
p[i].id=i;
}
sort(p+1,p+1+n,cmpx);
for (int i=1;i<=n-1;i++){
m++;
e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
}
sort(p+1,p+1+n,cmpy);
for (int i=1;i<=n-1;i++){
m++;
e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
}
sort(p+1,p+1+n,cmpz);
for (int i=1;i<=n-1;i++){
m++;
e[i]=(edge){p[i].id,p[i+1].id,dis(p[i].x,p[i].y,p[i].z,p[i+1].x,p[i+1].y,p[i+1].z)};
}
Kruskal();
return 0;
}