#include <iostream>
#include <vector>
#include <array>
#include <fstream>
struct Road{
int destination_village=0;
int distance=0;
};
class Solution{
int village_count,road_count;
int start_village,end_village;
std::vector<std::vector<Road>> roads;
std::vector<bool> visited;
std::istream& input;
std::ostream& output;
int final_distance=0;
void add_road(int first_village,int second_village,int distance){
roads[first_village].push_back({second_village,distance});
roads[second_village].push_back({first_village,distance});
}
public:
Solution(std::istream& input,std::ostream& output) : input(input), output(output){}
void read(){
input>>village_count>>road_count;
input>>start_village>>end_village;
roads.resize(village_count+1);
visited.resize(village_count+1);
for(int idx=0;idx<road_count;idx++){
int first_village,second_village,distance;
input>>first_village>>second_village>>distance;
add_road(first_village,second_village,distance);
}
}
void dfs(int curr_village,int curr_distance){
if(curr_village == end_village){
final_distance=curr_distance;
return;
}
for(auto road:roads[curr_village]){
int next_village=road.destination_village;
int road_length=road.distance;
if(visited[next_village]){
continue;
}
visited[next_village]=true;
bool is_previous_village=next_village<curr_village;
if(is_previous_village){
dfs(next_village,curr_distance-road_length);
}else{
dfs(next_village,curr_distance+road_length);
}
}
}
void run(){
constexpr int initial_distance=0;
dfs(start_village,initial_distance);
}
void print(){
output<<final_distance;
}
};
int main(){
std::ifstream fin("sate.in");
std::ofstream fout("sate.out");
Solution sate(fin,fout);
sate.read();
sate.run();
sate.print();
}