#include<bits/stdc++.h>
using namespace std;
class Graph{
unordered_map<int, list<pair<int,int> > > m;
public:
void addEdge(int u,int v,int dist,bool bidir=true){
m[u].push_back(make_pair(v,dist));
if(bidir){
m[v].push_back(make_pair(u,dist));
}
}
void printAdj(){
//Let try to print the adj list
//Iterate over all the key value pairs in the map
for(auto j:m){
cout<<j.first<<"->";
//Iterater over the list of cities
for(auto l: j.second){
cout<<"("<<l.first<<","<<l.second<<")";
}
cout<<endl;
}
}
void dijkastraSSSP(int V ,int src){
unordered_map<int,int> dist;
//Set all distance to infinity
for(auto j:m){
dist[j.first] = INT_MAX;
}
//pair is of dist anf node
set<pair<int , int> > s;
s.insert(make_pair(0 , src));
while(!s.empty()){
pair<int, int> tmp = *(s.begin());
//removing this pair
s.erase(s.begin());
int node = tmp.second;
int dist_curr = tmp.first;
//now going through the neighbours of this node
for(auto neighbours :m[node]){
if(dist_curr + neighbours.second <dist[neighbours.first] ){
int dest = neighbours.first;
auto f = s.find( make_pair(dist[dest],dest));
if(f!=s.end()){
s.erase(f);
}
//Insert the new pair
dist[dest] = dist_curr + neighbours.second;
s.insert(make_pair(dist[dest],dest));
}
}
}
//Lets print distance to all other node from src
for(auto d:dist){
cout<<d.second<<" ";
}
}
};
int main(){
int t=0;
cin>>t;
while(t--){
Graph g;
int n , m;
cin>>n>>m;
for(int i =0;i<m;i++){
int x=0 , y=0 , dist=0;
cin>>x>>y>>dist;
g.addEdge(x , y , dist);
}
int s;
cin>>s;
//g.printAdj();
g.dijkastraSSSP(s , n);
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpjbGFzcyBHcmFwaHsKICAgIHVub3JkZXJlZF9tYXA8aW50LCBsaXN0PHBhaXI8aW50LGludD4gPiA+IG07CiAgICAKcHVibGljOgoKICAgIHZvaWQgYWRkRWRnZShpbnQgdSxpbnQgdixpbnQgZGlzdCxib29sIGJpZGlyPXRydWUpewogICAgICAgIG1bdV0ucHVzaF9iYWNrKG1ha2VfcGFpcih2LGRpc3QpKTsgCiAgICAgICAgaWYoYmlkaXIpewogICAgICAgICAgICBtW3ZdLnB1c2hfYmFjayhtYWtlX3BhaXIodSxkaXN0KSk7CiAgICAgICAgfQogICAgICAgIAogICAgfQogICAgdm9pZCBwcmludEFkaigpewogICAgICAgIC8vTGV0IHRyeSB0byBwcmludCB0aGUgYWRqIGxpc3QKICAgICAgICAvL0l0ZXJhdGUgb3ZlciBhbGwgdGhlIGtleSB2YWx1ZSBwYWlycyBpbiB0aGUgbWFwIAogICAgICAgIGZvcihhdXRvIGo6bSl7CiAgICAgICAgICAgIAogICAgICAgICAgICBjb3V0PDxqLmZpcnN0PDwiLT4iOwogICAgICAgICAgICAKICAgICAgICAgICAgLy9JdGVyYXRlciBvdmVyIHRoZSBsaXN0IG9mIGNpdGllcwogICAgICAgICAgICBmb3IoYXV0byBsOiBqLnNlY29uZCl7CiAgICAgICAgICAgICAgICAgICAgY291dDw8IigiPDxsLmZpcnN0PDwiLCI8PGwuc2Vjb25kPDwiKSI7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0PDxlbmRsOwogICAgICAgIH0KICAgIAogICAgfQoKCXZvaWQgZGlqa2FzdHJhU1NTUChpbnQgViAsaW50IHNyYyl7CgoJCXVub3JkZXJlZF9tYXA8aW50LGludD4gZGlzdDsKICAgICAgICAKICAgICAgICAvL1NldCBhbGwgZGlzdGFuY2UgdG8gaW5maW5pdHkKICAgICAgICBmb3IoYXV0byBqOm0pewogICAgICAgICAgICBkaXN0W2ouZmlyc3RdID0gSU5UX01BWDsKICAgICAgICB9CgkJLy9wYWlyIGlzIG9mIGRpc3QgYW5mIG5vZGUKCQlzZXQ8cGFpcjxpbnQgLCBpbnQ+ID4gczsKCgkJcy5pbnNlcnQobWFrZV9wYWlyKDAgLCBzcmMpKTsKCgkJd2hpbGUoIXMuZW1wdHkoKSl7CgoJCQlwYWlyPGludCwgaW50PiB0bXAgPSAqKHMuYmVnaW4oKSk7CgkJCS8vcmVtb3ZpbmcgdGhpcyBwYWlyICAKICAgICAgICAJcy5lcmFzZShzLmJlZ2luKCkpOyAKCQkJaW50IG5vZGUgPSB0bXAuc2Vjb25kOwoJCQlpbnQgZGlzdF9jdXJyID0gdG1wLmZpcnN0OwoKCQkJLy9ub3cgZ29pbmcgdGhyb3VnaCB0aGUgbmVpZ2hib3VycyBvZiB0aGlzIG5vZGUKCQkJZm9yKGF1dG8gbmVpZ2hib3VycyA6bVtub2RlXSl7CgoJCQkJaWYoZGlzdF9jdXJyICsgbmVpZ2hib3Vycy5zZWNvbmQgPGRpc3RbbmVpZ2hib3Vycy5maXJzdF0gKXsKCQkJCQkKCQkJCQlpbnQgZGVzdCA9IG5laWdoYm91cnMuZmlyc3Q7CgkJCQkJYXV0byBmID0gcy5maW5kKCBtYWtlX3BhaXIoZGlzdFtkZXN0XSxkZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgaWYoZiE9cy5lbmQoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHMuZXJhc2UoZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vSW5zZXJ0IHRoZSBuZXcgcGFpcgogICAgICAgICAgICAgICAgICAgIGRpc3RbZGVzdF0gPSBkaXN0X2N1cnIgKyBuZWlnaGJvdXJzLnNlY29uZDsKICAgICAgICAgICAgICAgICAgICBzLmluc2VydChtYWtlX3BhaXIoZGlzdFtkZXN0XSxkZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL0xldHMgcHJpbnQgZGlzdGFuY2UgdG8gYWxsIG90aGVyIG5vZGUgZnJvbSBzcmMKICAgICAgICBmb3IoYXV0byBkOmRpc3QpewogICAgICAgICAgICAKICAgICAgICAgICAgY291dDw8ZC5zZWNvbmQ8PCIgIjsKICAgICAgICB9Cgl9Cn07CgoKaW50IG1haW4oKXsKCiAgICAKICAgIGludCB0PTA7CgljaW4+PnQ7Cgl3aGlsZSh0LS0pewogICAgR3JhcGggZzsKCWludCBuICwgbTsKCWNpbj4+bj4+bTsKCglmb3IoaW50IGkgPTA7aTxtO2krKyl7CiAgICAJaW50IHg9MCAsIHk9MCAsIGRpc3Q9MDsKCQljaW4+Png+Pnk+PmRpc3Q7CgkJZy5hZGRFZGdlKHggLCB5ICwgZGlzdCk7Cgl9CglpbnQgczsKCWNpbj4+czsKICAgIC8vZy5wcmludEFkaigpOwogICAJZy5kaWprYXN0cmFTU1NQKHMgLCBuKTsKCX0KfQ==