#include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define vi vector<int> #define wgraph vector<pair<int,int>> #define ll long long int #define pb push_back const int MAX_INT = numeric_limits<int>::max(); const int MIN_INT = numeric_limits<int>::min(); int main() { //REMINDER DONT USE endl use "\n" ios_base::sync_with_stdio(false); cin.tie(NULL); int cases; cin >> cases; for (int i = 1; i <= cases; ++i) { int n, lines, t; cin >> n >> lines; vector<pair<int,int>> adj[n]; for (int j = 0; j < lines; ++j) { int u, v, w; cin >> u; cin >> v; cin >> w; pair<int,int> temp {v, w}; pair<int,int> temp2 {u, w}; adj[u].push_back(temp); adj[v].push_back(temp2); } cin >> t; int x = t; priority_queue<pair<int,int>> q; bool processed[n] = {false}; int distance[n]; for (int i = 0; i < n; i++) { distance[i] = MAX_INT; } distance[x] = 0; q.push({0,x}); while (!q.empty()) { int a = q.top().second; q.pop(); if (processed[a]) continue; processed[a] = true; for (auto u : adj[a]) { int b = u.first, w = u.second; int bottleneckLarge = max(distance[a], w); if (bottleneckLarge < distance[b]) { distance[b] = bottleneckLarge; q.push({-bottleneckLarge,b}); } } } cout << "Case " << i << ":" << '\n'; for (int j = 0; j < n; ++j) { if (j == t) { cout << "0" << '\n'; } else { int temp = distance[j]; if (temp == MAX_INT) { cout << "Impossible" << "\n"; } else { cout << temp << "\n"; } } } } return 0; }