#include <bits/stdc++.h>
using namespace std;
const int N = 2020;
vector<tuple<int, int, int> > edges;
vector<int> g[N];
vector<int> back_edge[N];
bool global;
int num[N], low[N], low2[N], cnt, pai[N], pw[N], aux[N], prev_pai[N],
    prev_pw[N], sobe[N], prev_sobe[N];
int edg_used, edg_u, edg_v, edg_w;
void dfs(int u) {
  num[u] = low[u] = ++cnt;
  bool flag = false;
  for (auto w : g[u]) {
    int x, v, p;
    tie(x, v, p) = edges[w];
    if (v == u) swap(v, x);
    if (edg_used == w) continue;
    if (!num[v]) {
      pai[v] = u;
      pw[v] = p;
      sobe[v] = w;
      dfs(v);
      low[u] = min(low[u], low[v]);
    } else if (flag or pai[u] != v) {
      low[u] = min(low[u], num[v]);
      if (!global and num[u] > num[v]) back_edge[u].push_back(w);
    } else if (pai[u] == v)
      flag = true;
  }
}
int main(void) {
  int n, m;
  scanf("%d %d", &n, &m);
  int s, t;
  scanf("%d %d", &s, &t);
  for (int i = 0; i < m; i++) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    g[u].push_back(i);
    g[v].push_back(i);
    edges.emplace_back(u, v, w);
  }
  edg_used = -1;
  dfs(s);
  global = true;
  int S = s;
  if (!low[t]) {
    printf("0\n0\n");
    return 0;
  }
  int ans = 0x3f3f3f3f;
  int edg;
  int v = t;
  while (v != s) {
    int u = pai[v];
    if (low[v] > num[u]) {
      if (pw[v] < ans) edg = sobe[v];
      ans = min(ans, pw[v]);
    }
    v = u;
  }
  int dupla = INT_MAX;
  int x, y;
  for (int i = 1; i <= n; i++) {
    if (back_edge[i].empty()) continue;
    int k = 0, ans = 0x3f3f3f3f;
    for (int j = 0; j < back_edge[i].size(); j++) {
      int e = back_edge[i][j];
      int x, v, p;
      tie(x, v, p) = edges[e];
      if (v == i) swap(v, x);
      if (num[v] < ans) k = j;
    }
    vector<int> c[5];
    cnt = 0;
    for (int j = 1; j <= n; j++) {
      c[0].push_back(num[j]);
      c[1].push_back(low[j]);
      c[2].push_back(pai[j]);
      c[3].push_back(pw[j]);
      c[4].push_back(sobe[j]);
      num[j] = low[j] = 0;
    }
    tie(edg_u, edg_v, edg_w) = edges[back_edge[i][k]];
    edg_used = back_edge[i][k];
    dfs(s);
    ans = 0x3f3f3f3f;
    int v = t, edg;
    while (v != s) {
      int u = pai[v];
      if (low[v] > num[u]) {
        if (pw[v] < ans) edg = sobe[v];
        ans = min(ans, pw[v]);
      }
      v = u;
    }
    if (ans != 0x3f3f3f3f and ans + edg_w < dupla) {
      dupla = ans + edg_w;
      x = back_edge[i][k];
      y = edg;
    }
    for (int j = 1; j <= n; j++) {
      num[j] = c[0][j - 1];
      low[j] = c[1][j - 1];
      pai[j] = c[2][j - 1];
      pw[j] = c[3][j - 1];
      sobe[j] = c[4][j - 1];
    }
  }
  for (int i = 1; i <= n; i++) {
    prev_pai[i] = pai[i];
    prev_pw[i] = pw[i];
    prev_sobe[i] = sobe[i];
  }
  for (int i = 1; i <= n; i++) {
    if (i == s) continue;
    cnt = 0;
    for (int j = 1; j <= n; j++) num[j] = low[j] = 0;
    tie(edg_u, edg_v, edg_w) = edges[prev_sobe[i]];
    edg_used = prev_sobe[i];
    dfs(s);
    if (!low[t]) continue;
    int ans = 0x3f3f3f3f, v = t, edg;
    while (v != s) {
      int u = pai[v];
      if (low[v] > num[u]) {
        if (pw[v] < ans) edg = sobe[v];
        ans = min(ans, pw[v]);
      }
      v = u;
    }
    if (ans != 0x3f3f3f3f and ans + edg_w < dupla) {
      dupla = ans + edg_w;
      x = prev_sobe[i];
      y = edg;
    }
  }
  if (ans == 0x3f3f3f3f and dupla == INT_MAX) {
    printf("-1\n");
  } else if (ans < dupla and ans != 0x3f3f3f3f)
    printf("%d\n1\n%d\n", ans, edg + 1);
  else
    printf("%d\n2\n%d %d\n", dupla, x + 1, y + 1);
  return 0;
}
