#include <bits/stdc++.h>
using namespace std;
const int maxnn = 1e5 + 6;
struct st {
  int end;
  int bug;
  int next;
  int w;
};
vector<int> G[maxnn];
st edge[maxnn];
int head[maxnn];
int cnt;
vector<int> res;
void add(int bug, int end, int w) {
  edge[++cnt].next = head[bug];
  edge[cnt].end = end;
  edge[cnt].bug = bug;
  edge[cnt].w = w;
  head[bug] = cnt;
}
int deg[maxnn];
int tp[maxnn];
int toop(int mid, int n) {
  int i;
  int num = 0;
  memset(tp, 0, sizeof(tp));
  memset(deg, 0, sizeof(deg));
  for (i = 1; i < n + 1; ++i) G[i].clear();
  for (i = 1; i < cnt + 1; ++i) {
    if (mid < edge[i].w) {
      deg[edge[i].end]++;
      G[edge[i].bug].push_back(edge[i].end);
    }
  }
  queue<int> quu;
  for (i = 1; i < n + 1; ++i) {
    if (deg[i] == 0) {
      quu.push(i);
      tp[i] = ++num;
    }
  }
  while (!quu.empty()) {
    int u = quu.front();
    quu.pop();
    for (i = 0; i < G[u].size(); ++i) {
      int v = G[u][i];
      deg[v]--;
      if (deg[v] == 0) {
        quu.push(v);
        tp[v] = ++num;
      }
    }
  }
  if (num == n) return 1;
  return 0;
}
int main() {
  int n, m;
  cin >> n >> m;
  int i;
  for (i = 0; i < m; ++i) {
    int u, v, w;
    cin >> u >> v >> w;
    add(u, v, w);
    deg[v]++;
  }
  int l = 0;
  int r = 1e9;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (toop(mid, n))
      r = mid - 1;
    else
      l = mid + 1;
  }
  toop(l, n);
  int rescost = 0;
  for (i = 1; i < cnt + 1; ++i) {
    if (edge[i].w <= l && tp[edge[i].end] < tp[edge[i].bug]) {
      rescost = max(rescost, edge[i].w);
      res.push_back(i);
    }
  }
  cout << rescost << " " << res.size() << endl;
  for (auto it : res) cout << it << " ";
  return 0;
}
