#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
int head[100005],cur[100005],dep[100005],nxt[200005],to[200005],out[100005],root;
ll len[200005];
bitset<100005>vis;
int cnt=1;
inline void addEdge(int u,int v,ll w)
{
nxt[++cnt]=head[u];
to[cnt]=v;
len[cnt]=w;
head[u]=cnt;
}
int n,u,v;
ll w;
inline int read()
{
int x(0);char c(0);
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
return x;
}
void write(ll x)
{
if(x>9)write(x/10);
putchar(x%10+'0');
}
ll ans;
bool bfs()
{
vis.reset();
for(int i=1;i<=n+1;i++)
{
dep[i]=0;
cur[i]=head[i];
}
queue<int>q;
vis[root]=1;
dep[root]=1;
q.push(root);
while(q.size())
{
int u=q.front();
q.pop();
for(int e=head[u];e;e=nxt[e])
{
int v=to[e];
if(!dep[v]&&len[e])
{
dep[v]=dep[u]+1;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
return dep[n+1];
}
ll dfs(int u,ll in)
{
if(u==n+1)return in;
ll out=0;
for(int e=cur[u];e;e=nxt[e])
{
cur[u]=e;
int v=to[e];
if(len[e]&&dep[v]==dep[u]+1)
{
ll res=dfs(v,min(len[e],in-out));
if(res>0)
{
len[e]-=res;
len[e^1]+=res;
out+=res;
if(in==out)break;
}
}
}
return out;
}
void dinic()
{
while(bfs())
{
ans+=dfs(root,inf<<1);
}
}
void DFS(int u,int father)
{
bool flag=0;
for(int e=head[u];e;e=nxt[e])
{
int v=to[e];
if(v!=father)
{
flag=1;
DFS(v,u);
len[e^1]=0;
}
}
if(!flag) addEdge(u,n+1,inf),addEdge(n+1,u,0);
}
int main()
{
n=read();root=read();
for(int i=1;i<n;i++)
{
u=read();v=read();w=read();
addEdge(u,v,w);
addEdge(v,u,w);
}
DFS(root,0);
dinic();
write(ans);
return 0;
}