#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
using namespace std;
const int maxn=1005;
const int inf = 0x3f3f3f3f;
int mapp[maxn][maxn];
int dis[maxn],diss[maxn];
int vis[maxn],viss[maxn];
int sum[maxn];
int a,b,c,n,m,x;
int minx;
void dijkstra1(int x)
{
for(int i=1;i<=n;i++)
{
dis[i]=mapp[x][i];
}
for(int i=0;i<n;i++)
{
int k=0;
int minx=inf;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&minx>dis[j])
{
minx=dis[j];
k=j;
}
}
vis[k]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]>dis[k]+mapp[k][j])
{
dis[j]=dis[k]+mapp[k][j];
}
}
}
}
void dijkstra2(int x)
{
for(int i=1;i<=n;i++)
{
diss[i]=mapp[i][x];
}
for(int i=0;i<n;i++)
{
int k=0;
int minx=inf;
for(int j=1;j<=n;j++)
{
if(!viss[j]&&minx>diss[j])
{
minx=diss[j];
k=j;
}
}
viss[k]=1;
for(int j=1;j<=n;j++)
{
if(!viss[j]&&diss[j]>diss[k]+mapp[j][k])
{
diss[j]=diss[k]+mapp[j][k];
}
}
}
}
int main()
{
scanf("%d %d %d",&n,&m,&x);
memset(mapp,inf,sizeof(mapp));
memset(vis,0,sizeof(vis));
memset(dis,0,sizeof(dis));
memset(diss,0,sizeof(diss));
memset(viss,0,sizeof(viss));
memset(sum,0,sizeof(sum));
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&a,&b,&c);
mapp[a][b]=c;
}
dijkstra1(x);
dijkstra2(x);
for(int i=1;i<=n;i++)
{
if(x==i)
continue;
sum[i]=dis[i]+diss[i];
}
sort(sum+1,sum+n+1);
printf("%d\n",sum[n]);
return 0;
}