#include<bits/stdc++.h>
using namespace std;
void algo(int s, vector<vector<pair<int, int> > > adj, vector<bool> &visited, vector<int> &dist, int n){
visited[s] = true;
dist[s] = 0;
queue<int> q;
q.push(s);
while(!q.empty()){
//cout << "inside" << endl;
int temp = q.front();
q.pop();
vector<pair<int, int> >::iterator i;
int u = -1, min_dist = INT_MAX;
for(i = adj[temp].begin(); i != adj[temp].end(); i++){
if(dist[(i->first)] > dist[temp] + i->second){
dist[(i->first)] = dist[temp] + i->second;
}
// if(!visited[(i->first)] && dist[(i->first)] < min_dist){
// min_dist = dist[(i->first)];
// u = (i->first);
// q.push(u);
// visited[u] = true;
// }
for(int j = 1; j <= n; j++){
if(!visited[j] && dist[j] < min_dist){
min_dist = dist[j];
u = j;
}
}
if(u != -1){
q.push(u);
visited[u] = true;
}
}
}
}
int main(){
int t;
cin >> t;
while(t--){
int n, m, u, v, w, s;
cin >> n >> m;
vector<vector<pair<int, int> > > adj(n+1, vector<pair<int, int> >());
for(int i = 0; i < m; i++){
cin >> u >> v >> w;
adj[u].push_back(make_pair(v, w));
adj[v].push_back(make_pair(u, w));
}
cin >> s;
vector<int> dist(n+1, INT_MAX);
vector<bool> visited(n+1, false);
algo(s, adj, visited, dist, n);
for(int i = 1; i <= n; i++){
if(i != s && dist[i] != INT_MAX){
cout << dist[i] << " ";
}
else if(i != s && dist[i] == INT_MAX){
cout << -1 << " ";
}
}
cout << endl;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZvaWQgYWxnbyhpbnQgcywgdmVjdG9yPHZlY3RvcjxwYWlyPGludCwgaW50PiA+ID4gYWRqLCB2ZWN0b3I8Ym9vbD4gJnZpc2l0ZWQsIHZlY3RvcjxpbnQ+ICZkaXN0LCBpbnQgbil7CiAgdmlzaXRlZFtzXSA9IHRydWU7CiAgZGlzdFtzXSA9IDA7CiAgcXVldWU8aW50PiBxOwogIHEucHVzaChzKTsKICB3aGlsZSghcS5lbXB0eSgpKXsKICAgIC8vY291dCA8PCAiaW5zaWRlIiA8PCBlbmRsOwogICAgaW50IHRlbXAgPSBxLmZyb250KCk7CiAgICBxLnBvcCgpOwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+ID46Oml0ZXJhdG9yIGk7CiAgICBpbnQgdSA9IC0xLCBtaW5fZGlzdCA9IElOVF9NQVg7CiAgICBmb3IoaSA9IGFkalt0ZW1wXS5iZWdpbigpOyBpICE9IGFkalt0ZW1wXS5lbmQoKTsgaSsrKXsKICAgICAgaWYoZGlzdFsoaS0+Zmlyc3QpXSA+IGRpc3RbdGVtcF0gKyBpLT5zZWNvbmQpewogICAgICAgIGRpc3RbKGktPmZpcnN0KV0gPSBkaXN0W3RlbXBdICsgaS0+c2Vjb25kOwogICAgICB9CiAgICAgIC8vIGlmKCF2aXNpdGVkWyhpLT5maXJzdCldICYmIGRpc3RbKGktPmZpcnN0KV0gPCBtaW5fZGlzdCl7CiAgICAgIC8vICAgbWluX2Rpc3QgPSBkaXN0WyhpLT5maXJzdCldOwogICAgICAvLyAgIHUgPSAoaS0+Zmlyc3QpOwogICAgICAvLyAgIHEucHVzaCh1KTsKICAgICAgLy8gICB2aXNpdGVkW3VdID0gdHJ1ZTsKICAgICAgLy8gfQogICAgICBmb3IoaW50IGogPSAxOyBqIDw9IG47IGorKyl7CiAgICAgICAgaWYoIXZpc2l0ZWRbal0gJiYgZGlzdFtqXSA8IG1pbl9kaXN0KXsKICAgICAgICAgIG1pbl9kaXN0ID0gZGlzdFtqXTsKICAgICAgICAgIHUgPSBqOwogICAgICAgIH0KICAgICAgfQogICAgICBpZih1ICE9IC0xKXsKICAgICAgICBxLnB1c2godSk7CiAgICAgICAgdmlzaXRlZFt1XSA9IHRydWU7CiAgICAgIH0KICAgIH0KICB9Cn0KCmludCBtYWluKCl7CiAgaW50IHQ7CiAgY2luID4+IHQ7CiAgd2hpbGUodC0tKXsKICAgIGludCBuLCBtLCB1LCB2LCB3LCBzOwogICAgY2luID4+IG4gPj4gbTsKICAgIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsIGludD4gPiA+IGFkaihuKzEsIHZlY3RvcjxwYWlyPGludCwgaW50PiA+KCkpOwogICAgZm9yKGludCBpID0gMDsgaSA8IG07IGkrKyl7CiAgICAgIGNpbiA+PiB1ID4+IHYgPj4gdzsKICAgICAgYWRqW3VdLnB1c2hfYmFjayhtYWtlX3BhaXIodiwgdykpOwogICAgICBhZGpbdl0ucHVzaF9iYWNrKG1ha2VfcGFpcih1LCB3KSk7CiAgICB9CiAgICBjaW4gPj4gczsKICAgIHZlY3RvcjxpbnQ+IGRpc3QobisxLCBJTlRfTUFYKTsKICAgIHZlY3Rvcjxib29sPiB2aXNpdGVkKG4rMSwgZmFsc2UpOwogICAgYWxnbyhzLCBhZGosIHZpc2l0ZWQsIGRpc3QsIG4pOwogICAgZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewogICAgICBpZihpICE9IHMgJiYgZGlzdFtpXSAhPSBJTlRfTUFYKXsKICAgICAgICBjb3V0IDw8IGRpc3RbaV0gPDwgIiAiOwogICAgICB9CiAgICAgIGVsc2UgaWYoaSAhPSBzICYmIGRpc3RbaV0gPT0gSU5UX01BWCl7CiAgICAgICAgY291dCA8PCAtMSA8PCAiICI7CiAgICAgIH0KICAgIH0KICAgIGNvdXQgPDwgZW5kbDsKICB9Cn0K