#include <bits/stdc++.h>   using namespace std;   class trio {    public:     long long first, second, third;   };   class quad {    public:     long long first, second, third, fourth;   };   class DSU {    public:     long long *par, *size;     DSU(long long n) {       par = new long long[n + 1];       size = new long long[n + 1];       for (long long i = 0; i < n + 1; ++i) {         par[i] = i;         size[i] = 0;       }     }     long long find(long long a) {       long long p = a, third;       while (par[p] != p) p = par[p];       while (p != a) {         third = par[a];         par[a] = p;         a = third;       }       return a;     }     void union_(long long a, long long b) {       long long u1 = find(a);       long long u2 = find(b);       if (size[u1] < size[u2]) {         par[u1] = u2;       } else {         if (size[u2] < size[u1]) {           par[u2] = u1;         } else {           par[u1] = u2;           size[u1]++;         }       }     }   };   bool mycom(quad a, quad b) { return a.first < b.first; }   long long *intime, *outime, timt = 1;   bool inacestor(long long a, long long b) {     return (intime[a] <= intime[b] && outime[a] >= outime[b]);   }   long long tree[100010][20];   long long dp[100010][20];   void dfs(long long i, list<pair<long long, long long> > *adj) {     intime[i] = timt;     timt++;     for (auto it : adj[i]) {       if (it.first != tree[i][0]) {         tree[it.first][0] = i;         dp[it.first][0] = it.second;         dfs(it.first, adj);       }     }     outime[i] = timt;     timt++;   }   long long func(long long a, long long b) {     long long ans = 0;     for (long long j = 19; j >= 0; --j) {       if (inacestor(tree[a][j], b)) continue;       ans = max(ans, dp[a][j]);       a = tree[a][j];     }     for (long long j = 19; j >= 0; --j) {       if (inacestor(tree[b][j], a)) continue;       ans = max(ans, dp[b][j]);       b = tree[b][j];     }     if (!inacestor(a, b) && !inacestor(b, a)) {       ans = max(ans, dp[b][0]);       ans = max(ans, dp[a][0]);     } else {       if (inacestor(a, b)) {         ans = max(ans, dp[b][0]);       } else         ans = max(ans, dp[a][0]);     }     return ans;   }   int32_t main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     cout.tie(NULL);     ;     long long n, m;     cin >> n >> m;     quad edges[m + 1];     bool select[m + 1];     memset(select, 0, sizeof(select));     for (long long i = 0; i < m; ++i) {       cin >> edges[i].second >> edges[i].third >> edges[i].first;       edges[i].fourth = i;     }     sort(edges, edges + m, mycom);     DSU dsu1(n);     long long ans[m + 1];     for (long long i = 0; i < m; ++i) {       ans[i] = -1;     }     list<pair<long long, long long> > adj[n + 1];     for (long long i = 0; i < m; ++i) {       if (dsu1.find(edges[i].second) != dsu1.find(edges[i].third)) {         dsu1.union_(edges[i].second, edges[i].third);         select[i] = 1;         adj[edges[i].second].push_back({edges[i].third, edges[i].first});         adj[edges[i].third].push_back({edges[i].second, edges[i].first});       }     }     intime = new long long[n + 1];     outime = new long long[n + 1];     tree[1][0] = -1;     dfs(1, adj);     tree[1][0] = 1;     dp[1][0] = 0;     for (long long j = 1; j < 20; ++j) {       for (long long i = 1; i < n + 1; ++i) {         tree[i][j] = tree[tree[i][j - 1]][j - 1];         dp[i][j] = max(dp[tree[i][j - 1]][j - 1], dp[i][j - 1]);       }     }     for (long long j = 0; j < m; ++j) {       if (select[j] == 0) {         ans[edges[j].fourth] = func(edges[j].second, edges[j].third);       }     }     for (long long i = 0; i < m; ++i) {       if (ans[i] != -1) {         cout << ans[i] << endl;       }     }   }