#include <bits/stdc++.h>
 
using namespace std;
 
int n,m,o;
int dis[1005][1005];
int vt[1005][1005];
int from[1005];
struct _tuple {
    int y;
    int val;
};
vector <_tuple> A[10005];
struct _tuple2 {
    int idx;
    int data;
    bool operator<(const _tuple2 &a)const {
        return data>a.data;
    }
};
priority_queue <_tuple2> pq_dist;
 
void input() {
    ////freopen("in.txt","r",stdin);
    scanf("%d %d %d",&n,&m,&o);
    int t1,t2,t3;
    for(int i=0; i<m; i++) {
        scanf("%d %d %d",&t1,&t2,&t3);
        A[t1].push_back({t2,t3});
    }
}
 
void dijkstra(int org) {
    for(int j=1;j<=n;j++){
        for(int i=1; i<=n; i++) {
            dis[org][i]=0x7fffffff;
            vt[j][i]=0;
        }
    }
    dis[org][org]=0;
    vt[org][org]=1;
    from[org]=-1;
    _tuple2 tmp;
    int _min;
    int _minidx;
    for(int i=0; i<A[org].size(); i++) {
        dis[org][A[org][i].y]=A[org][i].val;
        tmp.idx=A[org][i].y;
        tmp.data=A[org][i].val;
        from[A[org][i].y]=org;
        pq_dist.push(tmp);
        //printf("%d %d %d\n",org,tmp.idx,tmp.data);
    }
    while(!pq_dist.empty()) {
        while(!pq_dist.empty()) {
            _min=pq_dist.top().data;
            _minidx=pq_dist.top().idx;
            //printf("%d %d %d\n",org,pq_dist.top().idx,pq_dist.top().data);
            pq_dist.pop();
            //printf(" %d %d %d\n",org,from[_minidx],_minidx);
            if(vt[from[_minidx]][_minidx]==0) {
                //printf(" %d %d %d\n",org,from[_minidx],_minidx);
                break;
            }
        }
        if(vt[from[_minidx]][_minidx]==1) {
            break;
        }
        vt[from[_minidx]][_minidx]=1;
        int t_node;
        int t_val;
        for(int j=0; j<A[_minidx].size(); j++) {
            t_node=A[_minidx][j].y;
            t_val=A[_minidx][j].val;
            //printf("  %d %d %d %d\n",_minidx,t_node,t_val,vt[_minidx][t_node]);
            if(vt[_minidx][t_node]==0&&dis[org][t_node]>dis[org][_minidx]+t_val) {
                dis[org][t_node]=dis[org][_minidx]+t_val;
                tmp.idx=t_node;
                tmp.data=dis[org][t_node];
                pq_dist.push(tmp);
                //printf("  %d %d %d\n",_minidx,t_node,dis[org][t_node]);
                from[t_node]=_minidx;
                //vt[_minidx][t_node]=0;
                /*for(int k=0;k<A[t_node].size();k++){
                    vt[t_node][A[t_node][k].y]=0;
                    //printf("   %d %d %d",t_node,k,)
                }*/
            }
        }
    }
}
 
int main() {
    int tmp;
    int _max=0;
    input();
    /*for(int i=1;i<=m;i++){
        for(int j=0;j<A[i].size();j++){
            printf("%d %d %d\n",i,A[i][j].y,A[i][j].val);
        }
    }*/
    for(int i=1; i<=n; i++) {
        dijkstra(i);
    }
    /*for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%d ",dis[i][j]);
        }
        printf("\n");
    }*/
    for(int i=1;i<=n;i++){
        tmp=dis[i][o]+dis[o][i];
        //printf("%d %d\n",i,tmp);
        if(_max<tmp) {
            _max=tmp;
        }
    }
    printf("%d",_max);
    return 0;
}

Comments