#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool read(T &x) {
  int c = getchar();
  int sgn = 1;
  while (~c && c<'0' | c> '9') {
    if (c == '-') sgn = -1;
    c = getchar();
  }
  for (x = 0; ~c && '0' <= c && c <= '9'; c = getchar()) x = x * 10 + c - '0';
  x *= sgn;
  return ~c;
}
struct debugger {
  template <typename T>
  debugger &operator,(const T &v) {
    cerr << v << "    ";
    return *this;
  }
} dbg;
template <class T>
void __stl_print__(T &x) {
  cerr << "[";
  for (__typeof((x).end()) i = (x).begin(); i != (x).end(); ++i)
    cerr << (i != x.begin() ? ", " : "") << *i;
  cerr << "]" << endl;
}
template <class T, class U>
inline T max(T &a, U &b) {
  return a > b ? a : b;
}
template <class T, class U>
inline T min(T &a, U &b) {
  return a < b ? a : b;
}
template <class T, class U>
inline T swap(T &a, U &b) {
  T tmp = a;
  a = b;
  b = tmp;
}
const long long INF = (1ll) << 50;
const int mx = 3e5 + 7;
const int mod = 1000000007;
const double pi = 2 * acos(0.0);
int EQ(double d) {
  if (fabs(d) < 1e-7) return 0;
  return d > 1e-7 ? 1 : -1;
}
struct node {
  int v, tt, id;
  long long w;
  node(int _v, long long _w, int _id, int _t) {
    v = _v;
    w = _w;
    id = _id;
    tt = _t;
  }
  bool operator<(const node &a) const {
    if (w != a.w) return w > a.w;
    return tt > a.tt;
  }
};
vector<node> adj[mx];
vector<int> ans;
priority_queue<node> q;
bool flag[mx];
int wh[mx];
int main() {
  int n = ({
    int a;
    read(a);
    a;
  }),
      m = ({
        int a;
        read(a);
        a;
      });
  for (__typeof((m)-1) i = (0); i <= ((m)-1); ++i) {
    int u = ({
      int a;
      read(a);
      a;
    }),
        v = ({
          int a;
          read(a);
          a;
        }),
        w = ({
          int a;
          read(a);
          a;
        });
    adj[u].push_back(node(v, w, i + 1, w));
    adj[v].push_back(node(u, w, i + 1, w));
    wh[i + 1] = w;
  }
  int u = ({
    int a;
    read(a);
    a;
  });
  for (__typeof((adj[u]).end()) it = (adj[u]).begin(); it != (adj[u]).end();
       ++it) {
    q.push(*it);
  }
  int edge = 0;
  long long tot = 0;
  flag[u] = 1;
  while (edge < n - 1) {
    node tmp = q.top();
    q.pop();
    if (flag[tmp.v]) continue;
    flag[tmp.v] = 1;
    edge++;
    tot += wh[tmp.id];
    ans.push_back(tmp.id);
    for (__typeof((adj[tmp.v]).end()) it = (adj[tmp.v]).begin();
         it != (adj[tmp.v]).end(); ++it) {
      q.push(node((*it).v, (*it).w + tmp.w, (*it).id, (*it).w));
    }
  }
  cout << tot << endl;
  for (__typeof((ans).end()) it = (ans).begin(); it != (ans).end(); ++it)
    cout << *it << ' ';
}
