#include <bits/stdc++.h>
using namespace std;
#define ll long long
vector<ll> K;
map<ll,map<ll,ll>> M;
vector<vector<ll>> UWU;
vector<vector<ll>> adj;
vector<ll> camino;
vector<ll> respuesta;
map<ll,ll> puerta;
vector<bool> visitado;
const int LOG = 20;
vector<vector<ll>> up;
vector<ll> depth;
vector<bool> visitadoperm;
bool nosepuede=false;
void dfs_lca(ll v, ll p){
up[v][0] = p;
for(int i = 1; i < LOG; i++){
up[v][i] = up[up[v][i-1]][i-1];
}
for(auto to : adj[v]){
if(to != p){
depth[to] = depth[v] + 1;
dfs_lca(to, v);
}
}
}
ll lca(ll a, ll b){
if(depth[a] < depth[b]) swap(a,b);
ll diff = depth[a] - depth[b];
for(int i = 0; i < LOG; i++){
if(diff & (1<<i)){
a = up[a][i];
}
}
if(a == b) return a;
for(int i = LOG-1; i >= 0; i--){
if(up[a][i] != up[b][i]){
a = up[a][i];
b = up[b][i];
}
}
return up[a][0];
}
ll dist(ll a, ll b){
ll c = lca(a,b);
return depth[a] + depth[b] - 2*depth[c];
}
void meter(ll cur){
if(visitado[cur]){
nosepuede=true;
return;
}
if(visitadoperm[cur]){
return;
}
visitado[cur]=true;
for(int i=0;i<UWU[cur].size();i++){
meter(UWU[cur][i]);
}
respuesta.push_back(cur);
respuesta.push_back(puerta[cur]);
}
bool dfs2(ll cur,ll p,ll obj){
if(cur==obj){
camino.push_back(cur);
return true;
}
for(auto x:adj[cur]){
if(x!=p){
if(dfs2(x,cur,obj)){
camino.push_back(cur);
return true;
}
}
}
return false;
}
void dfs(ll cur, ll p,vector<ll> keys){
if(M[p][cur]!=-1){
puerta[M[p][cur]]=p;
keys.push_back(M[p][cur]);
}
if(K[cur]==1){
UWU[cur]=keys;
}
for(auto x:adj[cur]){
if(x!=p){
dfs(x,cur,keys);
}
}
}
bool revisar(){
}
int main(){
ll n;
cin>>n;
ll s,t;
cin>>s>>t;
s--;
t--;
UWU.resize(n);
adj.resize(n);
K.assign(n,0);
visitado.assign(n,false);
for(int i=0;i<n-1;i++){
ll a,b,c;
cin>>a>>b>>c;
a--;
b--;
c--;
adj[a].push_back(b);
adj[b].push_back(a);
M[a][b]=c;
M[b][a]=c;
if(c!=-1){
K[c]=1;
}
}
for(int i=0;i<n;i++){
M[i][i]=-1;
}
up.assign(n, vector<ll>(LOG));
depth.assign(n, 0);
dfs_lca(s, s);
dfs(s,s,{});
dfs2(s,-1,t);
reverse(camino.begin(),camino.end());
ll actu=s;
ll ans=0;
respuesta.push_back(s);
visitadoperm.assign(n,false);
for(int i=1;i<camino.size();i++){
if(M[actu][camino[i]]!=-1){
visitado.assign(n,false);
meter(M[actu][camino[i]]);
for(int i=0;i<n;i++){
visitadoperm[i]=visitado[i];
}
}
actu=camino[i];
}
respuesta.push_back(t);
for(int i=1;i<respuesta.size();i++){
ans += dist(respuesta[i],respuesta[i-1]);
}
if(nosepuede){
ans=-1;
}
cout<<ans;
}