#include <bits/stdc++.h>
using namespace std;
int n, m;
struct EDGE {
  int u, v, w;
} p[100000 + 5];
struct Edge {
  int v, w, next;
} edge[100000 + 5];
int head[100000 + 5], cnt = 0;
void init() {
  cnt = 0;
  memset(head, -1, sizeof head);
}
void add_edge(int u, int v, int w) {
  edge[cnt].v = v;
  edge[cnt].w = w;
  edge[cnt].next = head[u];
  head[u] = cnt++;
}
int vis[100000 + 5];
int rd[100000 + 5];
bool check(int up) {
  memset(rd, 0, sizeof rd);
  memset(vis, 0, sizeof vis);
  queue<int> que;
  for (int i = 1; i <= m; i++)
    if (p[i].w > up) rd[p[i].v]++;
  int tot = 0;
  while (1) {
    for (int u = 1; u <= n; u++)
      if (!vis[u] && rd[u] == 0) que.push(u);
    if (que.empty()) break;
    while (!que.empty()) {
      int u = que.front();
      que.pop();
      vis[u] = ++tot;
      for (int i = head[u]; i != -1; i = edge[i].next)
        if (!vis[edge[i].v] && edge[i].w > up) rd[edge[i].v]--;
    }
  }
  for (int u = 1; u <= n; u++)
    if (!vis[u]) return 0;
  return 1;
}
int main() {
  if (1 && fopen("in.txt", "r")) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  init();
  scanf("%d%d", &n, &m);
  int l = 0, r = 0, mid;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &p[i].u, &p[i].v, &p[i].w);
    add_edge(p[i].u, p[i].v, p[i].w);
    r = max(r, p[i].w);
  }
  while (l < r) {
    mid = (l + r) >> 1;
    if (check(mid))
      r = mid;
    else
      l = mid + 1;
  }
  int ans = l;
  vector<int> ansque;
  check(ans);
  for (int i = 1; i <= m; i++) {
    int u = p[i].u, v = p[i].v;
    if (p[i].w <= ans && vis[u] > vis[v]) ansque.push_back(i);
  }
  sort(ansque.begin(), ansque.end());
  printf("%d %d\n", ans, ansque.size());
  for (int i = 0; i < ansque.size(); i++)
    printf("%d%c", ansque[i], i == ansque.size() - 1 ? '\n' : ' ');
  return 0;
}
