← Home
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()
}