#pragma G++ optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll n, m, cnt, ans, f[N];
inline ll read(){
ll x = 0, m = 1;
char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') m = -1;
ch = getchar();
}
while(isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * m;
}
inline void write(ll x){
if(x < 0){
putchar('-');
write(-x);
return;
}
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
struct Code{
ll u, v, sum;
}a[N << 2];
inline bool cmp(Code x, Code y){
return x.sum < y.sum;
}
struct code{
ll x, y, z, id;
}b[N << 2];
inline bool cmp1(code x, code y){
return x.x < y.x;
}
inline bool cmp2(code x, code y){
return x.y < y.y;
}
inline bool cmp3(code x, code y){
return x.z < y.z;
}
inline int choose(int x, int y){
return min(abs(b[x].x - b[y].x), min(abs(b[x].y - b[y].y), abs(b[x].z - b[y].z)));
}
inline ll find(int x){
return f[x] == x ? x : f[x] = find(f[x]);
}
inline void kruskal(){
for(int i = 1; i <= n; ++ i) f[i] = i;
for(int i = 1; i <= m; ++ i){
int u = find(a[i].u), v = find(a[i].v);
if(u == v) continue;
ans += a[i].sum;
f[v] = u;
++ cnt;
if(cnt == n - 1){
return;
}
}
}
signed main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n = read();
for(int i = 1; i <= n; ++ i){
b[i].x = read(), b[i].y = read(), b[i].z = read(), b[i].id = i;
}
sort(b + 1, b + 1 + n, cmp1);
for(int i = 1; i <= n; ++ i){
a[++ m] = (Code){
b[i].id, b[i + 1].id, choose(i, i + 1)
};
}
sort(b + 1, b + 1 + n, cmp2);
for(int i = 1; i <= n; ++ i){
a[++ m] = (Code){
b[i].id, b[i + 1].id, choose(i, i + 1)
};
}
sort(b + 1, b + 1 + n, cmp3);
for(int i = 1; i <= n; ++ i){
a[++ m] = (Code){
b[i].id, b[i + 1].id, choose(i, i + 1)
};
}
sort(a + 1, a + 1 + m, cmp);
kruskal();
write(ans);
return 0;
}
RT。