#include <stdio.h>#include <iostream>#include <stack>#include <string.h>#include <queue>#include <cmath>#include <vector>#include <algorithm>#include <map>#include <set>#include <string>using namespace std;typedef long long LL;/*int m, n ;int a[105][105];int b[105][105];int check(int x, int y) { if (0 <= x && x < n && 0 <= y && y < m) { return 1; } else { return 0; }}int dx[8] = {0, 0, 1, 1, 1, -1, -1, -1};int dy[8] = {-1, 1, -1, 0, 1, 0, 1, -1};bool cmp(pair<int, int> a, pair<int, int> b){ if(a.second != b.second){ return a.second < b.second; }}*/int n, m, x;struct edge { int to; int w;};vector<edge> G[1005];vector<edge> rG[1005];int d[1005];#define INF 0x3fffffffstruct Node { int to; int d; Node (int _to, int _d) { to = _to; d = _d; } bool operator < (const Node b) const { return d > b.d; } bool operator > (const Node b) const { return d < b.d; }};void short_path(int s) { for (int i = 0; i < n; i++) { d[i] = INF; } priority_queue<Node> q; d[s] = 0; q.push(Node(s, 0)); while (!q.empty()) { Node cur = q.top(); q.pop(); //if (d[cur.to] < cur.d) continue; for (int i = 0; i < G[cur.to].size(); i++) { edge e = G[cur.to][i]; if (d[e.to] > d[cur.to] + e.w) { d[e.to] = d[cur.to] + e.w; q.push(Node(cur.to, d[e.to])); } } }}void short_rpath(int s) { for (int i = 0; i < n; i++) { d[i] = INF; } priority_queue<Node> q; d[s] = 0; q.push(Node(s, 0)); while (!q.empty()) { Node cur = q.top(); q.pop(); //if (d[cur.to] < cur.d) continue; for (int i = 0; i < G[cur.to].size(); i++) { edge e = G[cur.to][i]; if (d[e.to] > d[cur.to] + e.w) { d[e.to] = d[cur.to] + e.w; q.push(Node(cur.to, d[e.to])); } } }}void add_edge(int u, int v, int w) { edge e; e.to = v; e.w = w; G[u].push_back(e); /* e.to = u; e.w = w; G[v].push_back(e); */}void add_redge(int u, int v, int w) { edge e; e.to = v; e.w = w; rG[u].push_back(e); /* e.to = u; e.w = w; G[v].push_back(e); */}int main() { cin >> n >> m >> x; for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; add_edge(u, v, w); add_redge(v, u, w); } short_path(x); int ans = 0; for (int i = 0; i < n; i++) { if (d[i] != INF) ans = max(ans, *d[i]); } short_rpath(x); for (int i = 0; i < n; i++) { if (d[i] != INF && i != x) ans = max(ans, 2*d[i]); }/* freopen("in.txt", "r", stdin); //freopen("out.txt","w",stdout); map<int, double> mapp1; int n; cin >> n; for(int i = 0; i < n; i++){ int esp; double coeff; cin >> esp >> coeff; if(mapp1[esp] != 0){ mapp1[esp] += coeff; }else { mapp1[esp] = coeff; } } int m; cin >> m; for(int i = 0; i < m; i++){ int esp; double coeff; cin >> esp >> coeff; if(mapp1[esp] != (double)0.0){ mapp1[esp] += coeff; }else { mapp1[esp] = coeff; } } vector<pair<int, double>> v1(mapp1.begin(), mapp1.end()); sort(v1.begin(), v1.end(), cmp); vector<pair<int, double> > v2; for(int i = 0; i < v1.size(); i++){ if(v1[i].second != (double)0.0){ pair<int, double> x(v1[i].first, v1[i].second); v2.push_back(x); } } cout << v2.size(); for(int i = 0; i < v2.size(); i++){ printf(" %d %.1lf", v2[i].first, v2[i].second); }*/ /*cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { int num = 0; for (int k = 0; k < 8; k++) { int x = i + dx[k]; int y = j + dy[k]; if (check(x, y) && a[x][y] == 1) { num++; } } if (a[i][j] == 1) { if (num < 2 || num > 3) { b[i][j] = 0; } else if (num == 2 || num == 3){ b[i][j] = 1; } } else { if (num == 3) { b[i][j] = 1; } } } } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (j == 0) { cout << b[i][j]; } else { cout << " " << b[i][j]; } } cout << endl; }*/ /* // freopen("in.txt", "r", stdin); int n; map<int, int> mapp; vector<pair<int, int>> vec; int num; while(scanf("%d", &num) && num){ //if(n == 0) break; //int num; // cin >> num; if(num == 1){ int id, P; cin >> id >> P; //mapp[id] = P; vec.insert(vec.begin(), make_pair(id, P)); sort(vec.begin(), vec.end(), cmp); }else if(num == 2){ if(vec.size() != 0){ //sort(mapp.begin(),mapp.end(), cmp); sort(vec.begin(), vec.end(), cmp); vector<pair<int, int>>::iterator iter; iter = vec.end(); iter--; cout << iter -> first << endl; vec.erase(iter); }else{ cout << "0" << endl; } }else if(num == 3){ if(vec.size() != 0){ // vector<pair<int, int>> vec(mapp.begin(), mapp.end()); sort(vec.begin(), vec.end(), cmp); vector<pair<int, int>>::iterator iter; iter = vec.begin(); cout << iter -> first << endl; vec.erase(iter); }else{ cout << "0" << endl; } } } */ /* int T; cin >> T; while (T--) { int n, k; cin >> n >> k; int m[105]; int p[105]; int pre[105]; int ans[105]; memset(m, 0, sizeof(m)); memset(p, 0, sizeof(p)); memset(pre, 0, sizeof(pre)); memset(ans, 0, sizeof(ans)); for (int i = 1; i <= n; i++) { cin >> m[i]; } for (int i = 1; i <= n; i++) { cin >> p[i]; } /* for (int i = 2; i <= n; i++) { for (int j = i-1; j >= 1; j--) { if (m[i] - m[j] > k) { pre[i] = j; //cout << "i = " << i << " j = " << j << endl; break; } } } */ /* ans[1] = p[1]; for (int i = 2; i <= n; i++) { ans[i] = max(ans[i-1], p[i] + ans[pre[i]]); // cout << ans[i] << endl; } for (int i = 2; i <= n; i++) { for (int j = i-1; j >= 1; j--) { if (m[i] - m[j] > k) { ans[i] = max(ans[i-1], p[i] + ans[j]); break; } } } cout << ans[n] << endl; } */ return 0;}