import sys
from collections import defaultdict

class Graph: 
  def __init__(self,n):
        self.vert = n
        #self.graph = defaultdict(list)
        self.graph = [[0 for column in range(n)] 
                      for row in range(n)]
        self.pathlist = defaultdict(list)

  def insertedge(self,a,b,dist):
    a = int(a)
    b = int(b)
    #print("bhavin")
    #self.graph[a].append(b)
    #print(adjmatrix)
    #a,b = input().split()
    #print(a,b)
    if(self.graph[a-1][b-1] != 0):
        temp = self.graph[a-1][b-1]
        if(temp > dist):
            self.graph[a-1][b-1] = dist
    else:
        self.graph[a-1][b-1] = dist
    if(self.graph[b-1][a-1] != 0):
        temp = self.graph[b-1][a-1]
        if(temp > dist):
            self.graph[b-1][a-1] = dist
    else:
        self.graph[b-1][a-1] = dist
    #self.printgraph()
  
  def printgraph(self):
    print(self.graph)
  
  def printshortestgraph(self, dist,src):
        f = open('somefile.txt', 'a')
        #print("Vertex tDistance from Source")
        for node in range(self.vert):
          if(node == src):
            continue
          if(node == self.vert - 1):
            if(dist[node] != sys.maxsize):
                print(dist[node],file = f)
            else:
                print(-1,file = f)
          elif(dist[node] != sys.maxsize):
            #print("From 0 to ", node ," - >",dist[node],end = " ")
            #print(self.pathlist[node])
            print(dist[node],end = ' ',file = f)
            #f.write(dist[node] + " ")
          elif(dist[node] == sys.maxsize):
            #print("From 0 to ", node ," - >",-1,end = " ")
            print(-1,end = ' ',file = f)
            #f.write(-1 + " ")
        #print('\n')
        #f.write("\n")
  
  def findmindist(self,dist,sptSet):
        #print(dist)
        minval = sys.maxsize
        #print(minval)
        #min_index = 225
        for v in range(self.vert):
            if dist[v] <= minval and sptSet[v] == False:
                minval = dist[v]
                min_index = v
                #print("assign",v)
        return min_index
  
  def dijkstra(self, src):
        dist = [sys.maxsize] * self.vert
        src = src - 1
        dist[src] = 0
        self.pathlist[0].append(src)
        sptSet = [False] * self.vert
        for cout in range(self.vert):
            u = self.findmindist(dist, sptSet)
            #if u == 225 :
            #  break
            sptSet[u] = True
            for v in range(self.vert):
                if self.graph[u][v] > 0 and sptSet[v] == False and dist[v] > dist[u] + self.graph[u][v]:
                        dist[v] = dist[u] + self.graph[u][v]
                        self.pathlist[v] = self.pathlist[u] + [v]
                        #print(dist,"Changing")
        #print("bhavin")
        self.printshortestgraph(dist,src)

t = int(input().strip())
for a0 in range(t):
    n,m = input().strip().split(' ')
    n,m = [int(n),int(m)]
    gr = Graph(n)
    for a1 in range(m):
        x,y,r = input().strip().split(' ')
        x,y,r = [int(x),int(y),int(r)]
        gr.insertedge(x,y,r)
    s = int(input().strip())
    gr.dijkstra(s)