#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii ;
typedef pair<ll, ll> pll ;
typedef vector<pii> vii ;
typedef vector<int> veci ;
typedef vector<pll> vll ;
typedef vector<ll> vecll;
// find_by_order order_of_key
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>
#define F first
#define S second
#define pb push_back
#define endl '\n'
#define Mp make_pair
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " = " << x << endl
#define set_dec(x) cout << fixed << setprecision(x);
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define file_io freopen("in.txt" , "r" , stdin) ; freopen("out.txt" , "w" , stdout);
#define lb lower_bound
#define ub upper_bound
#define for1(n) for(int i=1;i<=n;i++)
#define for0(n) for(int i=0;i<n;i++)
#define forn(n) for(int i=n;i>0;i--)
#define pq priority_queue <pii, vector<pii>, greater<pii>>
ll inf=1e18;
const int N=1e6+3,L=20;
int n,m,k,q,par[N][L],h[N],val[N],s,t,nn;
vector<pii>g[N];
vector<pii>vec;
ll dp[1<<20][20];
void dfs(int v){
for(auto[u,w]:g[v])if(u!=par[v][0]){
if(w!=0){val[u]|=(1<<vec.size());vec.pb({v,w});}
h[u]=h[v]+1;
val[u]|=val[v];
par[u][0]=v;
dfs(u);
}
}
int LCA(int v1,int v2){
if(h[v1]<h[v2])swap(v1,v2);
int x=h[v1]-h[v2];
for(int j=0;j<L;j++)if(x>>j&1)v1=par[v1][j];
if(v1==v2)return v1;
for(int j=L-1;j>=0;j--)if(par[v1][j]!=par[v2][j]){
v1=par[v1][j];
v2=par[v2][j];
}
return par[v1][0];
}
pii Move(int v1,int j){
int v2=vec[j].S,v3=vec[j].F;
int v4=LCA(v1,v2);
int v5=LCA(v2,v3);
int sum=h[v1]+h[v2]-h[v4]*2+h[v2]+h[v3]-h[v5]*2;
int o=(val[v1]^val[v2])|(val[v2]^val[v3]);
return {sum,o};
}
int main(){
fast_io
cin>>n>>s>>t;
for1(n-1){
int u,v,w;cin>>u>>v>>w;
g[u].pb({v,w});
g[v].pb({u,w});
}
dfs(s);
if(val[t]==0)return cout<<h[t]<<endl,0;
for(int j=1;j<L;j++)for1(n)par[i][j]=par[par[i][j-1]][j-1];
nn=vec.size();
for(int msk=1;msk<(1<<nn);msk++)for(int j=0;j<nn;j++)dp[msk][j]=inf;
for(int j=0;j<nn;j++){
pii p=Move(s,j);
if(p.S==0)dp[(1<<j)][j]=p.F;
}
ll ans=inf;
for(int msk=1;msk<(1<<nn);msk++){
for(int j=0;j<nn;j++)if(dp[msk][j]!=inf){
int v1=vec[j].F;
for(int k=0;k<nn;k++)if((msk>>k&1)==0){
pii p=Move(v1,k);
if((p.S|msk)==msk)
dp[msk|(1<<k)][k]=min(dp[msk|(1<<k)][k],dp[msk][j]+p.F);
}
int v2=t;
int v3=LCA(v1,v2);
int o=val[v1]^val[v2];
int sum=h[v1]+h[v2]-h[v3]*2;
if((msk|o)==msk)
ans=min(ans,dp[msk][j]+sum);
}
}
cout<<(ans==inf ? -1:ans)<<endl;
}