用SPFA水过
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
struct node{
int v;
int len;
int next;
}edgego[111111],edgeback[111111];
int pgo[1111];
int pback[1111];
int disgo[1111];
int disback[1111];
bool v[1111];
int ego,eback,n,m,x;
void add(int u,int v,int w){
edgego[ego].v = v;
edgego[ego].len = w;
edgego[ego].next = pgo[u];
pgo[u] = ego++;
edgeback[eback].v = u;
edgeback[eback].len = w;
edgeback[eback].next = pback[v];
pback[v] = eback++;
}
queue<int> q;
void spfa(int src,int d[],int p[],node e[]){
while(!q.empty())
q.pop();
q.push(src);
memset(v,0,sizeof(v));
for(int i = 1 ; i <= n ; i ++){
d[i] = 999999999;
}
d[src] = 0;
v[src] = 1;
while(!q.empty()){
int temp = q.front();
q.pop();
for(int i = p[temp] ; i != -1 ; i = e[i].next){
if(e[i].len + d[temp] < d[e[i].v]){
d[e[i].v] = e[i].len + d[temp];
//if(v[e[i].v] == 0){
// v[e[i].v] = 1;
// q.push(e[i].v);
//}
q.push(e[i].v);
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&x);
ego = 0;
eback = 0;
memset(pgo,-1,sizeof(pgo));
memset(pback,-1,sizeof(pback));
for(int i = 0 ; i < m ; i ++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
spfa(x,disgo,pgo,edgego);
spfa(x,disback,pback,edgeback);
int ans = 0;
for(int i = 1 ; i <= n ; i ++){
if(i == x)
continue;
//cout<<i<<" " <<disgo[i]<<" "<<disback[i]<<endl;
ans = max(ans,disgo[i] + disback[i]);
}
cout<<ans<<endl;
return 0;
}