#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>
using namespace std ;
#define Y second
#define X first
#define pii pair <int, int>
const int N=1050 ;
int n,m,x;
vector<pii>g[N];
vector<pii>e[N];
bool vis[N];
int dis[N];
int dis1[N];
void spfa(int root)
{
memset(dis,0x3f3f3f3f,sizeof dis) ;
memset(vis,false,sizeof vis) ;
dis[root]=0;
vis[root]=true;
queue<int>que;
while(!que.empty())
{
que.pop();
}
que.push(root);
while(!que.empty())
{
int u = que.front() ;
que.pop();
vis[u]=false ;
for(int i =0;i<g[u].size();++i)
{
int v=g[u][i].X,w=g[u][i].Y;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
if(!vis[v])
{
vis[v]=true;
que.push(v);
}
}
}
}
memset(dis1,0x3f3f3f3f,sizeof dis1);
memset(vis,false,sizeof vis);
dis1[root]=0;
vis[root]=true;
while(!que.empty())
{
que.pop();
}
que.push(root);
while(!que.empty())
{
int u = que.front();
que.pop();
vis[u]=false;
for(int i=0;i<e[u].size();++i)
{
int v = e[u][i].X , w = e[u][i].Y ;
if(dis1[v]>dis1[u]+w)
{
dis1[v]=dis1[u]+w;
if(!vis[v])
{
vis[v]=true ;
que.push(v);
}
}
}
}
return;
}
int main ()
{
cin>>n>>m>>x;
for( int i = 0 ; i <= n ; ++i )
{
g[i].clear() ;
e[i].clear();
}
while(m--)
{
int u,v,w ;
cin>>u>>v>>w;
g[v].push_back(pii(u,w)) ;
e[u].push_back(pii(v,w));
}
spfa(x);
int maxn=-1;
for(int i=1; i<=n; i++)
{
if(dis[i]+dis1[i]>maxn&&dis[i]!=0x3f3f3f3f&&dis1[i]!=0x3f3f3f3f)
maxn=dis[i]+dis1[i];
}
printf("%d\n",maxn);
return 0 ;
}