#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
struct TNode{
int m_Number;
int m_Effort;
vector<TNode *> m_Child;
TNode(int number, int effort){
m_Number = number;
m_Effort = effort;
}
};
TNode * SearchNode(int number, TNode * node){
if(node->m_Number == number){
return node;
}
if(node->m_Child.empty()){
return NULL;
}
TNode * child;
for(vector<TNode*>::iterator it = node->m_Child.begin(); it != node->m_Child.end(); ++it){
child = SearchNode(number, *it);
if(child){
break;
}
}
return child;
}
int GetMin(TNode * node){
if(node->m_Child.empty()){
return node->m_Effort;
}
int minChildren = 0;
for(vector<TNode*>::iterator it = node->m_Child.begin(); it != node->m_Child.end(); ++it){
minChildren += GetMin((*it));
}
if(minChildren < (node->m_Effort)){
return minChildren;
}
else{
return node->m_Effort;
}
}
int main(void){
int numOfNodes, central;
while(cin >> numOfNodes >> central){
TNode * root = new TNode(central, 0);
for(int i = 1; i < numOfNodes; i++){
int number1, number2, effort;
TNode * node1, * node2;
cin >> number1 >> number2 >> effort;
node1 = SearchNode(number1, root);
node2 = SearchNode(number2, root);
if(node1){
node2 = new TNode(number2, effort);
node1->m_Child.push_back(node2);
}
else{
node1 = new TNode(number1, effort);
node2->m_Child.push_back(node1);
}
}
int min = 0;
for(vector<TNode*>::iterator it = root->m_Child.begin(); it != root->m_Child.end(); ++it){
min += GetMin(*it);
}
cout << min << endl;
}
return 0;
}