#include <bits/stdc++.h>
template <class T>
inline bool chmax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);
vector<pair<long long, long long>> graph[100005];
vector<bool> used(100005);
vector<bool> used2(100005);
bool loop;
void dfs(int pos, int cost) {
  if (used2[pos] || loop) {
    loop = true;
    return;
  }
  used2[pos] = true;
  for (auto e : graph[pos]) {
    if (e.second > cost && !used[pos]) {
      dfs(e.first, cost);
    }
  }
  used2[pos] = false;
  used[pos] = true;
}
vector<int> sorted;
vector<int> sortedmap(100005);
void reset() {
  loop = false;
  for (int i = 1; i <= 100000; i++) {
    used[i] = false;
    used2[i] = false;
  }
}
vector<pair<int, int>> graph2;
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int n, m;
  cin >> n >> m;
  int maxc = 0;
  graph2.resize(m);
  for (int i = 0; i < (int)(m); i++) {
    int u, v, c;
    cin >> u >> v >> c;
    graph[u].push_back(pair<long long, long long>(v, c));
    graph2[i] = make_pair(u, v);
    chmax(maxc, c);
  }
  loop = false;
  for (int i = 1; i <= n; i++) {
    dfs(i, 0);
  }
  if (!loop) {
    cout << "0 0" << endl;
    cout << endl;
    return 0;
  }
  reset();
  int max = maxc;
  int min = 0;
  while (min + 1 < max) {
    int med = (min + max) / 2;
    for (int i = 1; i <= n; i++) {
      dfs(i, med);
    }
    if (loop) {
      min = med;
    } else {
      max = med;
    }
    reset();
  }
  int controller = max;
  for (int i = 1; i <= n; i++) {
    for (auto e : graph[i]) {
      if (e.second > max) sortedmap[e.first]++;
    }
  }
  stack<int> st;
  for (int i = 1; i <= n; i++) {
    if (sortedmap[i] == 0) {
      st.push(i);
    }
  }
  while (st.size()) {
    int i = st.top();
    st.pop();
    sorted.push_back(i);
    for (auto e : graph[i]) {
      if (e.second > max) {
        sortedmap[e.first]--;
        if (sortedmap[e.first] == 0) {
          st.push(e.first);
        }
      }
    }
  }
  for (int i = 0; i < (int)(n); i++) {
    sortedmap[sorted[i]] = i;
  }
  int cnt = 0;
  sorted.clear();
  for (int i = 0; i < (int)(m); i++) {
    int u = graph2[i].first;
    int v = graph2[i].second;
    if (sortedmap[u] > sortedmap[v]) {
      sorted.push_back(i);
    }
  }
  int sortedsize = sorted.size();
  cout << controller << ' ' << sortedsize << endl;
  for (int i = 0; i < (int)(sortedsize); i++) {
    cout << sorted[i] + 1 << ' ';
  }
  cout << endl;
}
