#include<bits/stdc++.h>
using namespace std;
const long long N=3e5+10;
long long u[N],v[N],w[N];
long long n,s,t,ans=0;
int col[N];
vector<pair<int,int> > a[N];
struct edge{
int k;
bool vis[N];
long long d[N];
long long f[N];
void init(int x){k=x;return ;}
void dijkstra(){
memset(d,0x3f,sizeof(d));
priority_queue<pair<int,int> > q;
q.push(make_pair(0,k)),d[k]=0;
while(!q.empty()){
long long x=q.top().second;q.pop();
if(vis[x])continue;vis[x]=true;
for(long long i=0;i<a[x].size();i++){
long long y=a[x][i].first;
if(d[y]>d[x]+a[x][i].second)
d[y]=d[x]+a[x][i].second,q.push(make_pair(-d[y],y));
}
}
}
void getfa(int x,int fa){
for(int i=0;i<a[x].size();i++)
if(a[x][i].first!=fa)
f[a[x][i].first]=x,getfa(a[x][i].first,x);
}
}T[5];
int main(){
cin>>n>>s>>t;
for(long long i=1;i<n;i++){
scanf("%lld%lld%lld",&u[i],&v[i],&w[i]);
a[u[i]].push_back(make_pair(v[i],w[i]));
a[v[i]].push_back(make_pair(u[i],w[i]));
}
T[1].init(s),T[2].init(t);
T[1].dijkstra(),T[2].dijkstra();
T[1].getfa(s,0),T[2].getfa(t,0);
for(long long i=1;i<=n;i++)
ans+=min(T[1].d[i],T[2].d[i]);
printf("%lld\n",ans);
for(int i=1;i<n;i++){
if(T[1].d[u[i]]<T[2].d[u[i]]){
if(v[i]==T[1].f[u[i]]) col[i]=1;
else if(u[i]==T[1].f[v[i]]) col[i]=2;
}
if(T[1].d[u[i]]>T[2].d[u[i]]){
if(v[i]==T[2].f[u[i]]) col[i]=1;
else if(u[i]==T[2].f[v[i]]) col[i]=2;
}
}
for(int i=1;i<n;i++)printf("%d",col[i]);
return 0;
}