// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 3001
#define INF (1ll<<60)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 19
#define ALPHA_SIZE 26
#define BASE 256
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
using namespace chrono ;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, m ;
ll arr[MAXN];
ll ma[MAXN][3] ;
ll lab[MAXN] ;
ll out[MAXN] ;
ll d[MAXN] ;
ll min_res = INF ;
vector<ll > S_edge ;
vector<ll > res;
vector<pair<ll,ll> > adj[MAXN] ;
vector<pair<ll,ll>> adj_normal[MAXN] ;
//**Struct**//
struct Edge {
ll u, v, w, id ;
bool operator < (const Edge & other ) const {
return w < other. w ;
}
} edge[MAXN];
//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
return x > y ? x = y, 1:0 ;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
return x < y ? x = y, 1:0 ;
}
void dfs(ll u, ll p ) {
}
void init() {
cin>>n >> m;
FOR(i,1, m ) {
ll x, y, w ;
cin >> x >> y >> w;
adj_normal[x].push_back({y , w}) ;
adj_normal[y].push_back({x , w }) ;
edge[i] = {x, y, w, i } ;
}
}
void dfs_1(ll u, ll p ) {
for(auto [v, w ] : adj[u] ) if(v != p ) {
dfs_1(v, u ) ;
if(ma[v][1] + w > ma[u][1]) {
ma[u][2] = ma[u][1] ;
ma[u][1] = ma[v][1] + w ;
} else maximize(ma[u][2], ma[v][1] + w) ;
}
}
void dfs_2(ll u, ll p ) {
for(auto [v, w] : adj[u]) if(v != p ) {
out[v] = out[u] + w ;
if(ma[v][1] + w == ma[u][1]) {
maximize(out[v], ma[u][2] + w ) ;
} else maximize(out[v], ma[u][1] + w) ;
dfs_2(v, u ) ;
}
}
void check() {
memset(ma, 0, sizeof ma ) ;
memset(out, 0, sizeof out ) ;
dfs_1(1, 1) ;
dfs_2(1, 1 );
ll duongkinh = 0 ;
FOR(u, 1, n ) maximize(duongkinh, ma[u][1] + out[u]) ;
if(minimize(min_res, duongkinh )) res = S_edge ;
}
void dijkstra(ll start ) {
FOR(i, 0, n ) d[i] = INF ;
d[start] = 0 ;
priority_queue<pair<ll,ll>, vector<pair<ll,ll>>, greater<>> pq ;
pq.push({0, start } ) ;
while(!pq.empty() ) {
pair<ll,ll> u = pq.top() ;
pq.pop() ;
if(d[u.se] < u.fi ) continue ;
for(pair<ll,ll> v : adj_normal[u.se ] ) {
if(d[v.fi] > v.se + u.fi ) pq.push({d[v.fi] = v.se + u.fi, v.fi }) ;
}
}
}
ll find_set(ll a) {
return lab[a] < 0 ? a : lab[a] = find_set(lab[a]) ;
}
bool union_set(ll a,ll b ) {
a = find_set(a) ;
b = find_set(b) ;
if(a == b) return false ;
if(lab[a] > lab[b] )swap(a, b ) ;
lab[a] += lab[b] ;
lab[b] = a;
return true ;
}
void build_tree() {
FOR(i, 0, n ) lab[i] = -1, adj[i].clear() ;
S_edge.clear() ;
FOR(i, 1, m ) {
ll u = edge[i].u, v = edge[i].v, w = edge[i].w, id = edge[i].id ;
if(d[u] + w == d[v]|| d[v] + w == d[u]) {
if(union_set(u, v)) {
adj[u].push_back({v, w}) ;
adj[v].push_back({u, w}) ;
S_edge.push_back(id) ;
}
}
}
// cout << S_edge.size() ; cout <<" run " << el ;
}
void solve() {
FOR(i, 1, n ) {
dijkstra(i) ;
build_tree() ;
check() ;
}
cout << min_res << el ;
for(ll v : res ) cout << v << " " ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
int t = 1; // cin >> t ;
while(t--) {
init();
solve();
}
cerr << "Bố thí " << el ;
cout << "Bố thí " << el ;
return (0&0);
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBfX1JPT1RfXyBpbnQgbWFpbigpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMiIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCi8vI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyLGJtaSxibWkyLHBvcGNudCxsemNudCIpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAzMDAxCiNkZWZpbmUgSU5GICgxbGw8PDYwKQojZGVmaW5lIEJMT0NLX1NJWkUgNDI1CiNkZWZpbmUgTUFYX05PREUgMTAwMTAwMQojZGVmaW5lIExPRyAxOQojZGVmaW5lIEFMUEhBX1NJWkUgMjYKI2RlZmluZSBCQVNFIDI1NgojZGVmaW5lIE5BTUUgImZpbGUiCiNkZWZpbmUgY29tcGFyZSh2KSBzb3J0KCh2KS5iZWdpbigpLCAodikuZW5kKCkpOyAodikuZXJhc2UodW5pcXVlKCh2KS5iZWdpbigpLCAodikuZW5kKCkpLCAodikuZW5kKCkpOwp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgY2hyb25vIDsKY29uc3QgbGwgTU9EW10gPSB7KGxsKTFlOSArIDIyNzcsIChsbCkxZTkgKyA1Mjc3LCAobGwpMWU5ICsgODI3NywgKGxsKTFlOSArIDkyNzcsIChsbCkgMWU5ICsgNyB9Owpjb25zdCBsbCBOTU9EID0gMTsKY29uc3QgaW50IGR4W10gPSB7LTEsIDAsIDEsMH07CmNvbnN0IGludCBkeVtdID0gezAsIDEsIDAsIC0xfTsKLy8qKlZhcmlhYmxlKiovLwpsbCBuLCBtIDsKbGwgYXJyW01BWE5dOwpsbCBtYVtNQVhOXVszXSA7CmxsIGxhYltNQVhOXSA7CmxsIG91dFtNQVhOXSA7CmxsIGRbTUFYTl0gOwpsbCBtaW5fcmVzID0gSU5GIDsKIHZlY3RvcjxsbCA+IFNfZWRnZSA7CnZlY3RvcjxsbCA+IHJlczsKdmVjdG9yPHBhaXI8bGwsbGw+ID4gYWRqW01BWE5dIDsKdmVjdG9yPHBhaXI8bGwsbGw+PiBhZGpfbm9ybWFsW01BWE5dIDsKLy8qKlN0cnVjdCoqLy8Kc3RydWN0IEVkZ2UgewogICAgbGwgdSwgdiwgdywgaWQgICA7CiAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IEVkZ2UgJiBvdGhlciApIGNvbnN0IHsKICAgICAgICByZXR1cm4gdyA8IG90aGVyLiB3IDsKICAgIH0KfSBlZGdlW01BWE5dOwovLyoqRnVuY3Rpb24qKi8vCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFkgPgpib29sIG1pbmltaXplKFggJiB4LCBjb25zdCBZICZ5ICkgewogICAgcmV0dXJuIHggPiB5ID8geCA9IHksIDE6MCA7Cn0KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWSA+CmJvb2wgbWF4aW1pemUoWCAmeCwgY29uc3QgWSAmeSApIHsKICAgIHJldHVybiB4IDwgeSA/IHggPSB5LCAxOjAgOwp9CnZvaWQgZGZzKGxsIHUsIGxsIHAgKSB7Cgp9CnZvaWQgaW5pdCgpIHsKICAgIGNpbj4+biA+PiBtOwogICAgRk9SKGksMSwgbSAgKSB7CiAgICAgICAgbGwgeCwgeSwgdyA7CiAgICAgICAgY2luID4+IHggPj4geSA+PiB3OwogICAgICAgIGFkal9ub3JtYWxbeF0ucHVzaF9iYWNrKHt5ICwgd30pIDsKICAgICAgICBhZGpfbm9ybWFsW3ldLnB1c2hfYmFjayh7eCAsIHcgfSkgOwogICAgICAgIGVkZ2VbaV0gPSB7eCwgIHksIHcsIGkgIH0gOwogICAgfQp9CnZvaWQgZGZzXzEobGwgdSwgbGwgcCApIHsKICAgIGZvcihhdXRvIFt2LCB3IF0gOiBhZGpbdV0gKSBpZih2ICE9IHAgKSB7CiAgICAgICAgICAgIGRmc18xKHYsIHUgKSA7CiAgICAgICAgICAgIGlmKG1hW3ZdWzFdICsgdyA+IG1hW3VdWzFdKSB7CiAgICAgICAgICAgICAgICBtYVt1XVsyXSA9IG1hW3VdWzFdIDsKICAgICAgICAgICAgICAgIG1hW3VdWzFdID0gbWFbdl1bMV0gKyB3IDsKICAgICAgICAgICAgfSBlbHNlIG1heGltaXplKG1hW3VdWzJdLCBtYVt2XVsxXSArIHcpICA7CiAgICAgICAgfQp9CnZvaWQgZGZzXzIobGwgdSwgbGwgcCApIHsKICAgIGZvcihhdXRvIFt2LCB3XSA6IGFkalt1XSkgaWYodiAhPSBwICkgewogICAgICAgICAgICBvdXRbdl0gPSBvdXRbdV0gKyB3IDsKICAgICAgICAgICAgaWYobWFbdl1bMV0gKyB3ID09IG1hW3VdWzFdKSB7CiAgICAgICAgICAgICAgICBtYXhpbWl6ZShvdXRbdl0sIG1hW3VdWzJdICsgdyApIDsKICAgICAgICAgICAgfSBlbHNlIG1heGltaXplKG91dFt2XSwgbWFbdV1bMV0gKyB3KSA7CiAgICAgICAgICAgIGRmc18yKHYsIHUgKSA7CiAgICAgICAgfQp9CnZvaWQgY2hlY2soKSB7CiAgICBtZW1zZXQobWEsIDAsIHNpemVvZiBtYSApICA7CiAgICBtZW1zZXQob3V0LCAwLCBzaXplb2Ygb3V0ICkgOwogICAgZGZzXzEoMSwgMSkgOwogICAgZGZzXzIoMSwgMSApOwogICAgbGwgZHVvbmdraW5oID0gMCA7CiAgICBGT1IodSwgMSwgIG4gKSBtYXhpbWl6ZShkdW9uZ2tpbmgsIG1hW3VdWzFdICsgb3V0W3VdKSA7CiAgICBpZihtaW5pbWl6ZShtaW5fcmVzLCBkdW9uZ2tpbmggKSkgcmVzID0gU19lZGdlIDsKfQp2b2lkIGRpamtzdHJhKGxsIHN0YXJ0ICkgewogICAgRk9SKGksIDAsIG4gICkgZFtpXSA9IElORiA7CiAgICBkW3N0YXJ0XSA9IDAgOwogICAgcHJpb3JpdHlfcXVldWU8cGFpcjxsbCxsbD4sIHZlY3RvcjxwYWlyPGxsLGxsPj4sIGdyZWF0ZXI8Pj4gcHEgOwogICAgcHEucHVzaCh7MCwgc3RhcnQgfSApICA7CiAgICB3aGlsZSghcHEuZW1wdHkoKSApIHsKICAgICAgICBwYWlyPGxsLGxsPiB1ID0gcHEudG9wKCkgOwogICAgICAgIHBxLnBvcCgpIDsKICAgICAgICBpZihkW3Uuc2VdIDwgdS5maSApIGNvbnRpbnVlIDsKICAgICAgICBmb3IocGFpcjxsbCxsbD4gdiA6IGFkal9ub3JtYWxbdS5zZSBdICkgewogICAgICAgICAgICBpZihkW3YuZmldID4gdi5zZSArIHUuZmkgKSBwcS5wdXNoKHtkW3YuZmldID0gdi5zZSArIHUuZmksIHYuZmkgICB9KSA7CiAgICAgICAgfQogICAgfQp9CmxsIGZpbmRfc2V0KGxsIGEpIHsKICAgIHJldHVybiBsYWJbYV0gPCAwID8gYSA6IGxhYlthXSA9IGZpbmRfc2V0KGxhYlthXSkgOwp9CmJvb2wgdW5pb25fc2V0KGxsIGEsbGwgYiApIHsKICAgIGEgPSBmaW5kX3NldChhKSA7CiAgICBiID0gZmluZF9zZXQoYikgOwogICAgaWYoYSA9PSBiKSByZXR1cm4gZmFsc2UgOwogICAgaWYobGFiW2FdID4gbGFiW2JdIClzd2FwKGEsIGIgKSA7CiAgICBsYWJbYV0gKz0gbGFiW2JdIDsKICAgIGxhYltiXSA9IGE7CiAgICByZXR1cm4gdHJ1ZSA7Cn0Kdm9pZCBidWlsZF90cmVlKCkgewoKICAgIEZPUihpLCAwLCBuICkgbGFiW2ldID0gLTEsIGFkaltpXS5jbGVhcigpIDsKICAgIFNfZWRnZS5jbGVhcigpIDsKICAgIEZPUihpLCAxLCBtICkgewogICAgICAgIGxsIHUgPSBlZGdlW2ldLnUsIHYgPSBlZGdlW2ldLnYsIHcgPSBlZGdlW2ldLncsIGlkID0gZWRnZVtpXS5pZCA7CiAgICAgICAgaWYoZFt1XSArIHcgPT0gZFt2XXx8IGRbdl0gKyB3ID09IGRbdV0pIHsKICAgICAgICAgICAgaWYodW5pb25fc2V0KHUsIHYpKSB7CiAgICAgICAgICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHt2LCB3fSkgOwogICAgICAgICAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh7dSwgd30pIDsKICAgICAgICAgICAgICAgIFNfZWRnZS5wdXNoX2JhY2soaWQpIDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KLy8gICAgY291dCA8PCBTX2VkZ2Uuc2l6ZSgpIDsgY291dCA8PCIgcnVuICIgPDwgZWwgOwp9CnZvaWQgc29sdmUoKSB7CgogICAgRk9SKGksIDEsICBuICkgewogICAgICAgIGRpamtzdHJhKGkpIDsKICAgICAgICBidWlsZF90cmVlKCkgOwogICAgICAgIGNoZWNrKCkgOwogICAgfQoKICAgIGNvdXQgPDwgbWluX3JlcyA8PCBlbCA7CiAgICBmb3IobGwgdiA6IHJlcyApIGNvdXQgPDwgdiA8PCAiICIgOwp9CgpfX1JPT1RfXyB7CiAgICAvLyBmcmVvcGVuKE5BTUUiLmlucCIgLCAiciIgLCBzdGRpbik7CiAgICAvLyBmcmVvcGVuKE5BTUUiLm91dCIgLCAidyIsIHN0ZG91dCkgOwogICAgZmFzdDsKICAgIGludCB0ID0gMTsgLy8gY2luID4+IHQgOwogICAgd2hpbGUodC0tKSB7CiAgICAgICAgaW5pdCgpOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICBjZXJyIDw8ICJC4buRIHRow60gIiA8PCBlbCAgOyAKICAgIGNvdXQgPDwgIkLhu5EgdGjDrSAiIDw8IGVsIDsgCiAgICByZXR1cm4gKDAmMCk7Cn0KCgoK