#include <bits/stdc++.h>   using namespace std;   struct ee {     int x, y, w;   };   vector<int> ke[300010], kq;   int n, m, s, c[300010] = {0}, p[300010], b[300010];   ee e[300010];   priority_queue<pair<long long, int> > Q;   long long d[300010];   void enter() {     scanf( %d%d , &n, &m);     for (int i = 1; i <= m; ++i) {       scanf( %d%d%d , &e[i].x, &e[i].y, &e[i].w);       ke[e[i].x].push_back(i);       ke[e[i].y].push_back(-i);     }     scanf( %d , &s);   }   void dijkstra() {     for (int i = 1; i <= n; ++i) d[i] = 1e18;     d[s] = 0;     Q.push(pair<long long, int>(0, s));     int u, v;     long long w;     while (!Q.empty()) {       u = Q.top().second;       w = -Q.top().first;       Q.pop();       if (d[u] != w) continue;       for (vector<int>::iterator i = ke[u].begin(); i != ke[u].end(); ++i) {         v = (*i > 0 ? e[*i].y : e[-*i].x);         if (w + e[abs(*i)].w < d[v]) {           d[v] = w + e[abs(*i)].w;           Q.push(pair<long long, int>(-d[v], v));           p[v] = abs(*i);         } else if (w + e[abs(*i)].w == d[v] && e[abs(*i)].w < e[p[v]].w)           p[v] = abs(*i);       }     }   }   bool compare(int i, int j) { return e[i].w < e[j].w; }   int Find(int u) {     if (p[u] < 0) return u;     return p[u] = Find(p[u]);   }   void process() {     long long ans = 0;     int t;     for (int i = 1; i <= m; ++i)       if (abs(d[e[i].x] - d[e[i].y]) != e[i].w)         continue;       else {         t = (d[e[i].x] > d[e[i].y] ? e[i].x : e[i].y);         if (i != p[t]) continue;         ans += e[i].w;         kq.push_back(i);       }     cout << ans <<   n ;     for (vector<int>::iterator i = kq.begin(); i != kq.end(); ++i)       printf( %d  , *i);   }   int main() {     enter();     dijkstra();     process();     return 0;   }   