#include <bits/stdc++.h>
using namespace std;
vector<pair<int, int> > p[300001];
map<pair<int, int>, int> mp;
vector<pair<int, int> > ans;
priority_queue<pair<int64_t, int> > q;
priority_queue<pair<int64_t, int> > distanc;
bool used[300001];
int64_t d[300001];
int64_t d1[300001];
int path[300001];
int len[300001], m, n;
int get_max() {
  if (distanc.size()) {
    while (distanc.size() and used[distanc.top().second] == 0) {
      distanc.pop();
    }
    if (distanc.size()) return distanc.top().second;
  }
  return -1;
}
int main() {
  int v1, v2, w;
  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &v1, &v2, &w);
    p[v1].push_back(make_pair(v2, w));
    p[v2].push_back(make_pair(v1, w));
    mp[make_pair(v1, v2)] = i;
    mp[make_pair(v2, v1)] = i;
  }
  for (int i = 1; i <= 3e5; i++) {
    d[i] = 1e15;
  }
  pair<int64_t, int> v, to;
  int u;
  cin >> u;
  q.push(make_pair(0, u));
  d[u] = 0;
  while (q.size()) {
    v = q.top();
    q.pop();
    if (used[v.second] == 1) continue;
    v.first = -v.first;
    used[v.second] = 1;
    for (int i = 0; i < p[v.second].size(); i++) {
      to = p[v.second][i];
      if (d[v.second] + to.second < d[to.first]) {
        d[to.first] = d[v.second] + to.second;
        q.push(make_pair(-d[to.first], to.first));
      }
    }
  }
  for (int i = 1; i <= 3e5; i++) {
    d1[i] = d[i];
    distanc.push(make_pair(-d1[i], i));
    d[i] = 1e15;
    used[i] = 0;
  }
  q.push(make_pair(0, u));
  d[u] = 0;
  path[u] = -1;
  while (q.size()) {
    v = q.top();
    q.pop();
    v.first = -v.first;
    if (used[v.second] == 1) continue;
    used[v.second] = 1;
    for (int i = 0; i < p[v.second].size(); i++) {
      to = p[v.second][i];
      if (to.second < d[to.first] and
          d1[v.second] + to.second <= d1[to.first]) {
        d[to.first] = to.second;
        path[to.first] = v.second;
        q.push(make_pair(-d[to.first], to.first));
      }
    }
  }
  int64_t weight = 0;
  while (1) {
    int last = get_max();
    if (last == -1) break;
    weight += d1[last];
    while (1) {
      used[last] = 0;
      if (path[last] != -1) {
        ans.push_back(make_pair(last, path[last]));
      }
      last = path[last];
      if (last == -1 or used[last] == 0) break;
    }
    if (last != -1) weight -= d1[last];
  }
  cout << weight << endl;
  for (int i = 0; i < ans.size(); i++) {
    printf("%d ", mp[make_pair(ans[i].first, ans[i].second)]);
  }
}
