#include<bits/stdc++.h>
using namespace std;
int read()
{
int x = 0,f = 0;char ch = getchar();
while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}
return f?-x:x;
}
const int N = 800100;
struct Tree{
int cnt,fa[N],val[N],head[N];
struct E{int w,to,nxt;}e[N];
vector<int> sons;
void add(int x,int y,int w)
{
e[++cnt].nxt = head[x];
e[cnt].to = y;
e[cnt].w = w;
head[x] = cnt;
}
void dfs(int x,int f)
{
int son = 0;
fa[x] = f;
for(int i = head[x];i;i = e[i].nxt)
{
int y = e[i].to;
val[y] = e[i].w;
if(y == f) continue;
dfs(y,x);
son++;
}
if(!son) sons.push_back(x);
}
Tree(){cnt = 0;}
}T;
struct Dinic{
int head[N],cur[N],dis[N],s,t,n,cnt;
struct E{int cap,flow,to,nxt;}e[N];
void add(int x,int y,int cap)
{
e[++cnt].nxt = head[x];e[cnt].flow = 0;
e[cnt].cap = cap;e[cnt].to = y;
head[x] = cnt;
}
int Dfs(int x,int a,int t)
{
if(a == 0 || x == t) return a;
int f = 0,flow = 0;
for(int i = cur[x];~i;i = e[i].nxt)
{
int y = e[i].to;
if(dis[x] + 1 == dis[y] && ((f = Dfs(y,min(a,e[i].cap - e[i].flow),t))>0))
{
a -= f;
flow += f;
e[i].flow += f;
e[i^1].flow -= f;
cur[x] = i;
if(a == 0) break;
}
}
return flow;
}
bool Bfs(int s,int t)
{
queue<int> Q;
memset(dis,0,sizeof(dis));
Q.push(s);dis[s] = 1;
while(Q.size())
{
int x = Q.front();Q.pop();
for(int i = head[x];~i;i = e[i].nxt)
{
int y = e[i].to;
if(e[i].cap > e[i].flow && !dis[y])
{
dis[y] = dis[x] + 1;
Q.push(y);
if(dis[t])
{
return true;
}
}
}
}
return false;
}
Dinic(int n_,int s_,int t_)
{
n = n_;s = s_;t = t_;cnt = -1;
memset(head,-1,sizeof(head));
}
}MaxFlow=(Dinic){0,0,0};
int n,rt,s,t,maxflow = 0;
int main()
{
n = read();rt = read();
for(int i = 1;i < n;i++)
{
int a = read(),b = read(),val = read();
T.add(a,b,val);
T.add(b,a,val);
}
s = n+1;t = n+2;
T.dfs(rt,t);
MaxFlow.n = n + 2;MaxFlow.s = s;MaxFlow.t = t;
for(int i = 0;i < T.sons.size();i++)
{
int y = T.sons[i];
cout<<y<<endl;
MaxFlow.add(y,t,0x3f3f3f3f);
MaxFlow.add(t,y,0);
}
MaxFlow.add(s,rt,0x3f3f3f3f);
MaxFlow.add(rt,s,0);
for(int i = 1;i <= n;i++)
{
if(i == rt) continue;
MaxFlow.add(T.fa[i],i,T.val[i]);
MaxFlow.add(i,T.fa[i],0);
}
while(MaxFlow.Bfs(s,t))
{
for(int i = 1;i <= t;i++) MaxFlow.cur[i] = MaxFlow.head[i];
maxflow += MaxFlow.Dfs(s,0x3f3f3f3f,t);
cout<<maxflow<<endl;
}
cout<<maxflow<<endl;
}