// Powered by C4droid with GCCv7.2.0
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <climits>
#define INFINITE 0x7F7F7F7F
#define _min(_a_,_b_) ((_a_)<(_b_)?(_a_):(_b_))
inline int getnum()
{
register char c=0;
while(!(c>='0' && c<='9'))
c=getchar();
register int a=0;
while(c>='0' && c<='9')
a=a*10+c-'0',c=getchar();
return a;
}
#define GetReverse(_x) ((_x)&1 ? (_x)+1 : (_x)-1)
int gcnt,ghead[20505],gnext[805050],gnode[805050],gflow[805050];
inline void insertLine(register int s,register int t,const int&v)
{
gnext[++gcnt]=ghead[s],ghead[s]=gcnt,gnode[gcnt]=t,gflow[gcnt]=v;
gnext[++gcnt]=ghead[t],ghead[t]=gcnt,gnode[gcnt]=s,gflow[gcnt]=0;
}
int S,T;
int dist[20505];
inline bool BFS()
{
static int lst[20505];
register int front=0,rear=0;
memset(dist,0,sizeof(dist));
dist[S]=1,lst[rear++]=S;
while(front<rear)
{
register int now=lst[front++];
for(register int j=ghead[now],t;j;j=gnext[j])
if(gflow[j]>0 && !dist[t=gnode[j]])
dist[t]=dist[now]+1,lst[rear++]=t;
}
return dist[T];
}
int cur[20505];
int DFS(register int now,register int mxflow)
{
if(now == T)
return mxflow;
for(register int j=cur[now],t;j;j=gnext[j])
{
cur[now]=j,t=gnode[j];
if(!(gflow[j]>0 && dist[t]==dist[now]+1))
continue;
register int nf=DFS(t,_min(mxflow,gflow[j]));
if(nf)
{
gflow[j]-=nf;
gflow[GetReverse(j)]+=nf;
return nf;
}
}
return 0;
}
int es[205050],et[205050],ew[205050];
int main()
{
register int N=getnum(),M=getnum(),E=getnum();
for(register int i=1;i<=M;i++)
es[i]=getnum(),et[i]=getnum(),ew[i]=getnum();
for(register int i=1;i<=M;i++)
if(i!=E && ew[i]<=ew[E])
{
insertLine(es[i],et[i],ew[E]-ew[i]+1);
insertLine(et[i],es[i],ew[E]-ew[i]+1);
}
S=es[E],T=et[E];
register int ans=0;
while(BFS())
{
for(register int i=1;i<=N;i++)
cur[i]=ghead[i];
while(int nf=DFS(S,INFINITE))
ans+=nf;
}
printf("%d\n",ans);
return 0;
}