#include <bits/stdc++.h>
using namespace std ;
#define endl '\n'
#define pb push_back
#define REP(i , n) for(int i = 0 , _n = (n) ; i < _n ; ++i)
#define MAXN 10005
const long long INF = 1e18 ;
vector <pair <int , int>> adj[MAXN + 1] ;
int numNode , k , startNode , sub[MAXN + 1] ;
long long f[MAXN + 1][MAXN + 1][2] ;
// f(i , numNodeVisited , 0/1)
void dfs(int u , int par) {
sub[u] = 1 ;
for(pair <int , int> it : adj[u]) if(it.first != par) dfs(it.first , u) , sub[u] += sub[it.first] ;
vector <vector <long long>> prev(min(k , sub[u]) + 1 , vector <long long> (2 , INF)) ;
REP(numVis , min(k , sub[u]) + 1) REP(up , 2) f[u][numVis][up] = INF ;
f[u][1][0] = 0 ;
f[u][1][1] = 0 ;
prev[1][0] = 0 ;
prev[1][1] = 0 ;
int cur = 1 ;
for(pair <int , int> it : adj[u]) {
int v = it.first , w = it.second ;
if(v == par) continue ;
cur += sub[v] ;
// cout << "BEFORE MERGE " << v << " TO " << u << endl ;
// REP(numVis , min(k , cur + 1)) REP(up , 2) {
// cout << "prev[" << numVis << "]" << "[" << up << "]" << " = " << prev[numVis][up] << endl ;
// }
REP(numVis , min(k , cur) + 1) REP(up , 2) REP(numJoin , min(k , sub[v]) + 1) REP(vp , 2) {
if(numVis + numJoin > min(k , cur)) break ;
if(up & vp) continue ;
f[u][numVis + numJoin][up | vp] = min(f[u][numVis + numJoin][up | vp] , prev[numVis][up] + f[v][numJoin][vp] + 2 * w - (vp == 1 ? w : 0) ) ;
}
REP(numVis , min(k , cur) + 1) REP(up , 2) prev[numVis][up] = f[u][numVis][up] ;
// cout << "AFTER MERGE " << v << " TO " << u << endl ;
// REP(numVis , min(k , cur + 1)) REP(up , 2) {
// cout << "prev[" << numVis << "]" << "[" << up << "]" << " = " << prev[numVis][up] << endl ;
// }
}
}
int main(void) {
ios_base::sync_with_stdio(false) ;
cout.tie(nullptr) ;
cin.tie(nullptr) ;
cin >> numNode >> k >> startNode ;
REP(faker , numNode - 1) {
int u , v , w ; cin >> u >> v >> w ;
adj[u].pb({v , w}) ; adj[v].pb({u , w}) ;
}
dfs(startNode , 0) ;
cout << f[startNode][k][1] << endl ;
return 0 ;
}