package main
import (
"bufio"
"io"
"os"
"strconv"
"strings"
)
type AdjEdge struct {
to int
w int64
idx int
}
type InputEdge struct {
u int
v int
w int64
}
type Item struct {
v int
d int64
}
type MinHeap []Item
func (h *MinHeap) Push(x Item) {
*h = append(*h, x)
i := len(*h) - 1
for i > 0 {
p := (i - 1) >> 1
if (*h)[p].d <= (*h)[i].d {
break
}
(*h)[p], (*h)[i] = (*h)[i], (*h)[p]
i = p
}
}
func (h *MinHeap) Pop() Item {
a := *h
n := len(a) - 1
res := a[0]
x := a[n]
a = a[:n]
if n > 0 {
a[0] = x
i := 0
for {
l := i*2 + 1
if l >= n {
break
}
r := l + 1
c := l
if r < n && a[r].d < a[l].d {
c = r
}
if a[i].d <= a[c].d {
break
}
a[i], a[c] = a[c], a[i]
i = c
}
}
*h = a
return res
}
func main() {
data, _ := io.ReadAll(os.Stdin)
p := 0
nextInt := func() int {
for p < len(data) && (data[p] == ' ' || data[p] == '\n' || data[p] == '\r' || data[p] == '\t') {
p++
}
sign := 1
if data[p] == '-' {
sign = -1
p++
}
x := 0
for p < len(data) && data[p] >= '0' && data[p] <= '9' {
x = x*10 + int(data[p]-'0')
p++
}
return x * sign
}
n := nextInt()
m := nextInt()
edges := make([]InputEdge, m+1)
adj := make([][]AdjEdge, n+1)
for i := 1; i <= m; i++ {
u := nextInt()
v := nextInt()
w := int64(nextInt())
edges[i] = InputEdge{u: u, v: v, w: w}
adj[u] = append(adj[u], AdjEdge{to: v, w: w, idx: i})
adj[v] = append(adj[v], AdjEdge{to: u, w: w, idx: i})
}
s := nextInt()
const INF int64 = 1<<62 - 1
dist := make([]int64, n+1)
for i := 1; i <= n; i++ {
dist[i] = INF
}
dist[s] = 0
h := MinHeap{}
h.Push(Item{v: s, d: 0})
for len(h) > 0 {
cur := h.Pop()
if cur.d != dist[cur.v] {
continue
}
for _, e := range adj[cur.v] {
nd := cur.d + e.w
if nd < dist[e.to] {
dist[e.to] = nd
h.Push(Item{v: e.to, d: nd})
}
}
}
bestW := make([]int64, n+1)
bestIdx := make([]int, n+1)
for i := 1; i <= n; i++ {
bestW[i] = INF
}
for i := 1; i <= m; i++ {
e := edges[i]
if dist[e.u]+e.w == dist[e.v] {
if e.w < bestW[e.v] {
bestW[e.v] = e.w
bestIdx[e.v] = i
}
}
if dist[e.v]+e.w == dist[e.u] {
if e.w < bestW[e.u] {
bestW[e.u] = e.w
bestIdx[e.u] = i
}
}
}
var sum int64
res := make([]int, 0, n-1)
for v := 1; v <= n; v++ {
if v == s {
continue
}
sum += bestW[v]
res = append(res, bestIdx[v])
}
var sb strings.Builder
sb.WriteString(strconv.FormatInt(sum, 10))
sb.WriteByte('\n')
for i, x := range res {
if i > 0 {
sb.WriteByte(' ')
}
sb.WriteString(strconv.Itoa(x))
}
sb.WriteByte('\n')
out := bufio.NewWriterSize(os.Stdout, 1<<20)
out.WriteString(sb.String())
out.Flush()
}