#include <bits/stdc++.h>
using namespace std;
const double PI = atan2(1, 0) * 2;
const string DIGITS = "0123456789";
const string ALPH = "abcdefghijklmnopqrstuvwxyz";
template <class T>
ostream &operator<<(ostream &out, vector<T> &a) {
  out << "{";
  for (auto x : a) out << x << " ";
  return out << "}";
}
void smain();
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cout << setprecision(12) << fixed;
  smain();
}
const long long N = 1 << 17, B = 100;
const long double pi = atan2(1, 0) * 2;
long long used[N], n, in[N];
vector<pair<long long, long long>> vertices[N];
vector<tuple<long long, long long, long long>> edge;
bool dfs(long long v, long long m, long long col) {
  bool label = 0;
  used[v] = col;
  in[v] = 1;
  for (auto p : vertices[v]) {
    if (!used[p.first] && p.second > m)
      label = max(label, dfs(p.first, m, col));
    else if (in[p.first] == 1 && p.second > m)
      label = 1;
  }
  in[v] = 2;
  return label;
}
bool check(long long m) {
  fill(used, used + N, 0);
  fill(in, in + N, 0);
  bool label = 0;
  long long col = 1;
  for (long long i = 1; i <= n; ++i)
    if (!used[i]) label = max(label, dfs(i, m, col++));
  if (label) return false;
  ;
  return true;
}
vector<long long> order;
void dfs2(long long v, long long r, long long c) {
  used[v] = 1;
  for (auto p : vertices[v]) {
    if (!used[p.first] && p.second > r) dfs2(p.first, r, c);
  }
  order.push_back(v);
}
void solution(long long r) {
  cout << r << ' ';
  fill(used, used + N, 0);
  for (long long i = 1; i <= n; ++i)
    if (!used[i]) {
      dfs2(i, r, i);
    }
  reverse(order.begin(), order.end());
  map<long long, long long> ps;
  for (long long i = 0; i < n; ++i) ps[order[i]] = i;
  vector<long long> ans;
  for (long long i = 0; i < ((long long)(edge.size())); ++i) {
    long long a, b, c;
    tie(a, b, c) = edge[i];
    if (ps[a] > ps[b]) ans.push_back(i + 1);
  }
  cout << ((long long)(ans.size())) << '\n';
  for (long long v : ans) cout << v << ' ';
}
void smain() {
  long long m;
  cin >> n >> m;
  edge.resize(m);
  for (long long i = 0; i < m; ++i) {
    long long a, b, c;
    cin >> a >> b >> c;
    vertices[a].push_back(make_pair(b, c));
    edge[i] = make_tuple(a, b, c);
  }
  long long l = -1, r = 1e9 + 10;
  while (r - l > 1) {
    long long m = (l + r) >> 1;
    if (check(m))
      r = m;
    else
      l = m;
  }
  solution(r);
}
