#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 1e9 //๋ฌดํ์ ๋ปํ๋ ๊ฐ์ผ๋ก 10์ต ์ง์ .
using namespace std;
int N, M, X; //N=๋ง์(๋
ธ๋) M=๋๋ก(๊ฐ์ ) X=๋์ฐฉ์ง
int d[1001]; //์ต์ ์๊ฐ์ ๊ธฐ๋กํด๋๋ ํ
์ด๋ธ
int result[1001]; //i->x->i์ ์๊ฐ์ ๊ธฐ๋กํ๋ ํ
์ด๋ธ
int ans = 0;
vector<pair<int, int>>graph[1001];
//์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ
void dijkstra(int start) {
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>pq;
pq.push({ 0,start }); //์ถ๋ฐ์ง๋ ์๊ฐ์ด 0;
d[start] = 0;
while (!pq.empty()) {
int dist = pq.top().first;
int now = pq.top().second;
pq.pop();
if (d[now]<dist) continue; //์ด๋ฏธ ๋ฐฉ๋ฌธ๋ ๋
ธ๋๋ผ๋ฉด ๋ฌด์
for (int i = 0; i < graph[now].size(); i++) {
int neighborDist = dist+graph[now][i].second;
int neighbor = graph[now][i].first;
if (neighborDist < d[neighbor]) {
d[neighbor] = neighborDist;
pq.push({ neighborDist,neighbor });
}
}
}
}
void reset() {
fill(d, d + 1001, INF);
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M >> X;
for (int i = 0; i < M; i++) {
int a, b, c; cin >> a >> b >> c;
graph[a].push_back({ b,c }); //a์์ b๊น์ง ๊ฐ๋๋ฐ c๋งํผ์ ์๊ฐ์ด ๋ ๋ค.
}
for (int i = 1; i <= N; i++) { //i->X ๊น์ง ์๊ฐ ๊ธฐ๋ก
reset(); //๋งค ํ์๋ง๋ค ์ด๊ธฐํ ์์ผ์ค๋ค.
dijkstra(i);
result[i] = d[X];
}
reset();
dijkstra(X); //์๋ณต์ ํด์ผ ํ๋๊น X์์ ๊ฐ ๋ง์(๋
ธ๋)=i ๊น์ง ๊ฑธ๋ฆฌ๋ d[] ํ
์ด๋ธ์ ๊ธฐ๋ก
for (int i = 1; i <= N; i++) { //X->i๊น์ง์ ์๊ฐ์ i->X ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋ํจ.
result[i] += d[i];
}
for (int i = 1; i <= N; i++) { //i->X->i ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
ans = max(ans, result[i]);
}
cout << ans;
}
๋๊ธ