
#include <iostream>
#include <algorithm>
#include <queue>
#define INF 999999999
using namespace std;
int N, M, X;
class node
{
public:
	int num;
	int weight;
};
int maxnum = 0;
int tempdist[10001];
int comedist[10001];
int godist[10001];
class cmp
{
public:
	bool operator()(node n1, node n2)
	{
		return n1.weight > n2.weight;
	}
};
vector<node> map[10001];
void dijkstra()
{
	priority_queue<node, vector<node>, cmp> pq;
	for( int i = 1 ; i <= N ; i++ )
	{
		if( i == X ) 
		{
			comedist[i] = 0;
			continue;
		}
		
		pq.push({i, 0});
		while(!pq.empty())
		{
			int c_n = pq.top().num;
			int c_w = pq.top().weight;
			pq.pop();
			if( tempdist[c_n] != INF ) continue;
			tempdist[c_n] = c_w;
			if( c_n == X )
			{
				comedist[i] = c_w;
				for( int j = 1 ; j <= N ; j++ )
				{
					tempdist[j] = INF;
				}
				
				while(!pq.empty()) pq.pop();
				break;
			}
			for( int j = 0 ; j < map[c_n].size() ; j++ )
			{
				if( tempdist[map[c_n][j].num] != INF ) continue;
				pq.push({map[c_n][j].num, c_w + map[c_n][j].weight});
			}
		}
	}
	pq.push({X, 0});
	while(!pq.empty())
	{
		int c_n = pq.top().num;
		int c_w = pq.top().weight;
		pq.pop();
		if( godist[c_n] != INF ) continue;
		godist[c_n] = c_w;
		for( int i = 0 ; i < map[c_n].size() ; i++ )
		{
			if( godist[map[c_n][i].num] != INF ) continue;
			pq.push({map[c_n][i].num, c_w + map[c_n][i].weight});
		}
	}
	for( int i = 1 ; i <= N ; i++ )
	{
		godist[i] = comedist[i] + godist[i];
		if( maxnum < godist[i] ) maxnum = godist[i];
	}
}
int main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> N >> M >> X;
	for( int i = 0 ; i < M ; i++ )
	{
		int u, v, w;
		cin >> u >> v >> w;
		map[u].push_back({v, w});
	}
	for( int i = 1 ; i <= N ; i++ )
	{
		tempdist[i] = INF;
		comedist[i] = INF;
		godist[i] = INF;
	}
	
	dijkstra();
	cout << maxnum << "\n";
	
	return 0;
}

다익스트라 관련 문제였다.
Baekjoon_Link 👈 Click here