#include <bits/stdc++.h>
using namespace std;
template <typename T>
void chmin(T &a, T b) {
  if (a > b) a = b;
}
template <typename T>
void chmax(T &a, T b) {
  if (a < b) a = b;
}
int in() {
  int x;
  scanf("%d", &x);
  return x;
}
long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
struct union_find {
  vector<int> par, rank, cost;
  void init(int n) {
    par.resize(n);
    rank.assign(n, 0);
    cost.assign(n, 0);
    for (int i = 0; i < n; ++i) par[i] = i;
  }
  int find(int x) {
    if (par[x] == x) return x;
    return find(par[x]);
  }
  bool same(int x, int y) { return find(x) == find(y); }
  void merge(int x, int y, int c) {
    x = find(x);
    y = find(y);
    if (x == y) return;
    if (rank[x] < rank[y]) {
      par[x] = y;
      cost[x] = c;
    } else {
      par[y] = x;
      cost[y] = c;
      if (rank[x] == rank[y]) rank[x]++;
    }
  }
  int calc(int u, int v) {
    map<int, int> mp;
    mp[v] = 0;
    while (par[v] != v) {
      mp[par[v]] = cost[v];
      v = par[v];
    }
    int ret = 0;
    while (mp.count(u) == 0) {
      chmax(ret, cost[u]);
      u = par[u];
    }
    chmax(ret, mp[u]);
    return ret;
  }
};
struct edge {
  int u, v, cost;
  bool operator<(const edge &other) const { return cost < other.cost; };
};
int main() {
  int n, m;
  cin >> n >> m;
  vector<pair<edge, int>> es;
  int v1, v2;
  for (int i = 0; i < m; ++i) {
    int u = in() - 1, v = in() - 1, c = in();
    es.emplace_back((edge){u, v, c}, i);
  }
  sort(es.begin(), es.end());
  union_find uf;
  uf.init(n);
  map<int, int> ans;
  for (auto tmp : es) {
    edge e = tmp.first;
    int idx = tmp.second;
    if (uf.same(e.u, e.v)) {
      ans[idx] = uf.calc(e.u, e.v);
    } else {
      uf.merge(e.u, e.v, e.cost);
    }
  }
  for (pair<int, int> p : ans) {
    printf("%d ", p.second);
  }
  cout << endl;
  return 0;
}
