#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5e4+10;
const int M = 1e5+10;
int F[N]; //并查集,用于找你和我共同的爸爸
int tol; //存储一个全局的边数
struct Edge{
int u,v,w;
}e[M];
bool cmp(Edge a,Edge b){ //贪心地排序,找小的
return a.w<b.w;
}
int find(int x){
if(F[x]==-1) return x;
else return F[x]=find(F[x]);
}
int Kruscal(int n){
memset(F,-1,sizeof(F));
sort(e,e+tol,cmp);
int cnt=0;
int ans=0;
int max_w = -1;
for(int i=0;i<tol;i++){
int u = e[i].u;
int v = e[i].v;
int w = e[i].w;
int t1 = find(u); //去找u的爸爸的....爸爸 (祖先)
int t2 = find(v); //去找v的爸爸的....爸爸 (祖先)
if(t1!=t2){ //发现u和v不是一家人,那我就让他们成为一家人
ans += w;
F[t1]=t2;
cnt++;
if(max_w<w){
max_w = w;
}
}
if(cnt==n-1) break;
}
if(cnt<n-1) return -1;
else return max_w;
}
int main(){
int n,m,root;
cin>>n>>m>>root;
tol = m;
for(int i=0;i<m;i++){
cin>>e[i].u>>e[i].v>>e[i].w;
}
int ans = Kruscal(n);
cout<<ans;
return 0;
}