#include <bits/stdc++.h>
using namespace std;
int n;
const int maxn = 300010;
const long long inf = 1e16;
int cnt, head[maxn];
int pre[maxn], vis[maxn], val[maxn];
long long dis[maxn];
struct edge {
  int to, w, nxt, id;
} e[maxn << 1];
void init() {
  cnt = 0;
  memset(head, -1, sizeof(head));
}
void add(int u, int v, int w, int id) {
  e[cnt].to = v;
  e[cnt].w = w;
  e[cnt].id = id;
  e[cnt].nxt = head[u];
  head[u] = cnt++;
}
void spfa(int s) {
  memset(pre, 0, sizeof(pre));
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i <= n; i++) dis[i] = inf;
  queue<int> que;
  que.push(s);
  dis[s] = 0, vis[s] = 1;
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    vis[u] = 0;
    for (int i = head[u]; ~i; i = e[i].nxt) {
      int v = e[i].to;
      if (dis[v] > dis[u] + e[i].w) {
        dis[v] = dis[u] + e[i].w;
        pre[v] = e[i].id;
        if (!vis[v]) {
          vis[v] = 1;
          que.push(v);
        }
      } else if (dis[v] == dis[u] + e[i].w) {
        if (e[i].w < val[pre[v]]) {
          pre[v] = e[i].id;
          if (!vis[v]) {
            vis[v] = 1;
            que.push(v);
          }
        }
      }
    }
  }
}
int main() {
  int m;
  while (~scanf("%d%d", &n, &m)) {
    init();
    for (int i = 1; i <= m; i++) {
      int u, v, w;
      scanf("%d%d%d", &u, &v, &w);
      add(u, v, w, i);
      add(v, u, w, i);
      val[i] = w;
    }
    int s;
    scanf("%d", &s);
    spfa(s);
    long long sum = 0;
    for (int i = 1; i <= n; i++)
      if (pre[i]) sum += val[pre[i]];
    cout << sum << endl;
    for (int i = 1; i <= n; i++)
      if (pre[i]) printf("%d ", pre[i]);
    printf("\n");
  }
  return 0;
}
