#include <bits/stdc++.h>
using namespace std;
int n, m;
struct EDGE {
  int u, v, w, num;
} g[1000010];
bool cmp(EDGE a, EDGE b) { return a.w < b.w; }
bool cmp1(EDGE a, EDGE b) { return a.num < b.num; }
struct edge {
  int v, w, next;
} e[100010 << 1];
int eid, p[100010 << 1];
void insert(int u, int v, int w) {
  e[++eid] = {v, w, p[u]};
  p[u] = eid;
}
int fa[100010];
int find(int u) {
  if (fa[u] == u) return u;
  return fa[u] = find(fa[u]);
}
bool vis[1000010];
void kruskal() {
  sort(g + 1, g + m + 1, cmp);
  for (int i = 1; i <= n; ++i) fa[i] = i;
  int res = n - 1;
  for (int i = 1; i <= m && res > 0; ++i) {
    int fu = find(g[i].u), fv = find(g[i].v);
    if (fu == fv) continue;
    fa[fv] = fu;
    insert(g[i].u, g[i].v, g[i].w);
    insert(g[i].v, g[i].u, g[i].w);
    res--;
    vis[g[i].num] = 1;
  }
}
int dep[100010], f[100010][30], maxx[100010][30];
void dfs(int u, int fa, int x) {
  dep[u] = dep[fa] + 1;
  f[u][0] = fa;
  maxx[u][0] = x;
  for (int i = 1; (1 << i) <= dep[u]; ++i) {
    f[u][i] = f[f[u][i - 1]][i - 1];
    maxx[u][i] = max(maxx[u][i - 1], maxx[f[u][i - 1]][i - 1]);
  }
  for (int i = p[u]; i; i = e[i].next) {
    int v = e[i].v;
    if (v != fa) dfs(v, u, e[i].w);
  }
}
int getans(int u, int v) {
  int ans = 0;
  if (dep[u] < dep[v]) swap(u, v);
  int x;
  for (x = 0; (1 << x) <= dep[u]; ++x)
    ;
  --x;
  for (int i = x; i >= 0; --i)
    if (dep[f[u][i]] >= dep[v]) ans = max(ans, maxx[u][i]), u = f[u][i];
  if (u == v) return ans;
  for (int i = x; i >= 0; --i)
    if (f[u][i] != f[v][i]) {
      ans = max(ans, max(maxx[u][i], maxx[v][i]));
      u = f[u][i], v = f[v][i];
    }
  return max(ans, max(maxx[u][0], maxx[v][0]));
}
int main() {
  cin >> n >> m;
  for (int i = 1; i <= m; ++i) cin >> g[i].u >> g[i].v >> g[i].w, g[i].num = i;
  kruskal();
  dfs(1, 1, 0);
  sort(g + 1, g + m + 1, cmp1);
  for (int i = 1; i <= m; ++i)
    if (!vis[i]) cout << getans(g[i].u, g[i].v) << endl;
  return 0;
}
