#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
#define ii pair<ll, ll>
#define fi first
#define se second
using namespace std;
const int maxn = 1e5;
const int maxlog = 20;
struct Edge
{
int x, y;
ll w;
};
int n, m, leader[maxn + 10], sz[maxn + 10], beg[maxn + 10], fin[maxn + 10], timer = 0;
int par[maxn + 10][maxlog + 2];
ll ans = 0, mx[maxn + 10][maxlog + 2];
bool vis[maxn + 10];
vector<ii> n_adj[maxn + 10];
Edge e[maxn + 10];
vector<Edge> notInMST;
bool cmp(Edge a, Edge b)
{
return a.w > b.w;
}
int find_leader(int x)
{
if (x == leader[x]) return x;
return leader[x] = find_leader(leader[x]);
}
bool connect(int x, int y)
{
x = find_leader(x);
y = find_leader(y);
if (x == y) return 0;
if (sz[x] < sz[y]) swap(x, y);
sz[x] += sz[y];
leader[y] = x;
return 1;
}
void dfs(int top)
{
vis[top] = 1;
beg[top] = ++timer;
for (ii pr : n_adj[top])
{
int next_top = pr.fi;
ll w = pr.se;
if (vis[next_top]) continue;
dfs(next_top);
mx[next_top][0] = w;
par[next_top][0] = top;
}
fin[top] = timer;
}
bool is_inside(int x, int y)
{
if (!x) return 1;
return beg[x] <= beg[y] && fin[y] <= fin[x];
}
int getLCA(int x, int y)
{
if (is_inside(x, y)) return x;
if (is_inside(y, x)) return y;
for (int i = maxlog; i >= 0; i--)
if (!is_inside(par[x][i], y))
x = par[x][i];
return par[x][0];
}
ll getmx(int x, int y)
{
if (x == y) return 0;
ll ans = 0;
for (int i = maxlog; i >= 0; i--)
if (!is_inside(par[x][i], y))
{
ans = max(ans, mx[x][i]);
x = par[x][i];
}
return max(ans, mx[x][0]);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("TROCHOI.INP", "r"))
{
freopen("TROCHOI.INP", "r", stdin);
freopen("TROCHOI.OUT", "w", stdout);
}
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
sz[i] = 1;
leader[i] = i;
}
for (int i = 1; i <= m; i++)
{
int x, y;
ll w;
cin >> x >> y >> w;
e[i] = {x, y, w};
}
sort(e + 1, e + m + 1, cmp);
for (int i = 1; i <= m; i++)
{
int x = e[i].x;
int y = e[i].y;
ll w = e[i].w;
if (connect(x, y))
{
n_adj[x].push_back({y, w});
n_adj[y].push_back({x, w});
}
else notInMST.push_back({x, y, w});
}
for (int i = 1; i <= n; i++)
if (!vis[i]) dfs(i);
for (int j = 1; j <= maxlog; j++)
for (int i = 1; i <= n; i++)
{
par[i][j] = par[par[i][j - 1]][j - 1];
mx[i][j] = max(mx[i][j - 1], mx[par[i][j - 1]][j - 1]);
}
for (Edge e : notInMST)
{
int x = e.x;
int y = e.y;
ll w = e.w;
int lca = getLCA(x, y);
ans = max(ans, max(getmx(x, lca), getmx(y, lca)) + w);
}
cout << ans;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8bGwsIGxsPgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY29uc3QgaW50IG1heG4gPSAxZTU7CmNvbnN0IGludCBtYXhsb2cgPSAyMDsKCnN0cnVjdCBFZGdlCnsKICAgIGludCB4LCB5OwogICAgbGwgdzsKfTsKCmludCBuLCBtLCBsZWFkZXJbbWF4biArIDEwXSwgc3pbbWF4biArIDEwXSwgYmVnW21heG4gKyAxMF0sIGZpblttYXhuICsgMTBdLCB0aW1lciA9IDA7CmludCBwYXJbbWF4biArIDEwXVttYXhsb2cgKyAyXTsKbGwgYW5zID0gMCwgbXhbbWF4biArIDEwXVttYXhsb2cgKyAyXTsKYm9vbCB2aXNbbWF4biArIDEwXTsKdmVjdG9yPGlpPiBuX2FkalttYXhuICsgMTBdOwpFZGdlIGVbbWF4biArIDEwXTsKdmVjdG9yPEVkZ2U+IG5vdEluTVNUOwoKYm9vbCBjbXAoRWRnZSBhLCBFZGdlIGIpCnsKICAgIHJldHVybiBhLncgPiBiLnc7Cn0KaW50IGZpbmRfbGVhZGVyKGludCB4KQp7CiAgICBpZiAoeCA9PSBsZWFkZXJbeF0pIHJldHVybiB4OwogICAgcmV0dXJuIGxlYWRlclt4XSA9IGZpbmRfbGVhZGVyKGxlYWRlclt4XSk7Cn0KYm9vbCBjb25uZWN0KGludCB4LCBpbnQgeSkKewogICAgeCA9IGZpbmRfbGVhZGVyKHgpOwogICAgeSA9IGZpbmRfbGVhZGVyKHkpOwogICAgaWYgKHggPT0geSkgcmV0dXJuIDA7CiAgICBpZiAoc3pbeF0gPCBzelt5XSkgc3dhcCh4LCB5KTsKICAgIHN6W3hdICs9IHN6W3ldOwogICAgbGVhZGVyW3ldID0geDsKICAgIHJldHVybiAxOwp9CnZvaWQgZGZzKGludCB0b3ApCnsKICAgIHZpc1t0b3BdID0gMTsKICAgIGJlZ1t0b3BdID0gKyt0aW1lcjsKICAgIGZvciAoaWkgcHIgOiBuX2Fkalt0b3BdKQogICAgewogICAgICAgIGludCBuZXh0X3RvcCA9IHByLmZpOwogICAgICAgIGxsIHcgPSBwci5zZTsKICAgICAgICBpZiAodmlzW25leHRfdG9wXSkgY29udGludWU7CiAgICAgICAgZGZzKG5leHRfdG9wKTsKICAgICAgICBteFtuZXh0X3RvcF1bMF0gPSB3OwogICAgICAgIHBhcltuZXh0X3RvcF1bMF0gPSB0b3A7CiAgICB9CiAgICBmaW5bdG9wXSA9IHRpbWVyOwp9CmJvb2wgaXNfaW5zaWRlKGludCB4LCBpbnQgeSkKewogICAgaWYgKCF4KSByZXR1cm4gMTsKICAgIHJldHVybiBiZWdbeF0gPD0gYmVnW3ldICYmIGZpblt5XSA8PSBmaW5beF07Cn0KaW50IGdldExDQShpbnQgeCwgaW50IHkpCnsKICAgIGlmIChpc19pbnNpZGUoeCwgeSkpIHJldHVybiB4OwogICAgaWYgKGlzX2luc2lkZSh5LCB4KSkgcmV0dXJuIHk7CiAgICBmb3IgKGludCBpID0gbWF4bG9nOyBpID49IDA7IGktLSkKICAgICAgICBpZiAoIWlzX2luc2lkZShwYXJbeF1baV0sIHkpKQogICAgICAgICAgICB4ID0gcGFyW3hdW2ldOwogICAgcmV0dXJuIHBhclt4XVswXTsKfQpsbCBnZXRteChpbnQgeCwgaW50IHkpCnsKICAgIGlmICh4ID09IHkpIHJldHVybiAwOwogICAgbGwgYW5zID0gMDsKICAgIGZvciAoaW50IGkgPSBtYXhsb2c7IGkgPj0gMDsgaS0tKQogICAgICAgIGlmICghaXNfaW5zaWRlKHBhclt4XVtpXSwgeSkpCiAgICAgICAgewogICAgICAgICAgICBhbnMgPSBtYXgoYW5zLCBteFt4XVtpXSk7CiAgICAgICAgICAgIHggPSBwYXJbeF1baV07CiAgICAgICAgfQogICAgcmV0dXJuIG1heChhbnMsIG14W3hdWzBdKTsKfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGlmIChmb3BlbigiVFJPQ0hPSS5JTlAiLCAiciIpKQogICAgewogICAgICAgIGZyZW9wZW4oIlRST0NIT0kuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiVFJPQ0hPSS5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG4gPj4gbTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBzeltpXSA9IDE7CiAgICAgICAgbGVhZGVyW2ldID0gaTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgIHsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICBsbCB3OwogICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gdzsKICAgICAgICBlW2ldID0ge3gsIHksIHd9OwogICAgfQogICAgc29ydChlICsgMSwgZSArIG0gKyAxLCBjbXApOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKQogICAgewogICAgICAgIGludCB4ID0gZVtpXS54OwogICAgICAgIGludCB5ID0gZVtpXS55OwogICAgICAgIGxsIHcgPSBlW2ldLnc7CiAgICAgICAgaWYgKGNvbm5lY3QoeCwgeSkpCiAgICAgICAgewogICAgICAgICAgICBuX2Fkalt4XS5wdXNoX2JhY2soe3ksIHd9KTsKICAgICAgICAgICAgbl9hZGpbeV0ucHVzaF9iYWNrKHt4LCB3fSk7CiAgICAgICAgfQogICAgICAgIGVsc2Ugbm90SW5NU1QucHVzaF9iYWNrKHt4LCB5LCB3fSk7CiAgICB9CiAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCiAgICAgICAgaWYgKCF2aXNbaV0pIGRmcyhpKTsKICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG1heGxvZzsgaisrKQogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHBhcltpXVtqXSA9IHBhcltwYXJbaV1baiAtIDFdXVtqIC0gMV07CiAgICAgICAgICAgIG14W2ldW2pdID0gbWF4KG14W2ldW2ogLSAxXSwgbXhbcGFyW2ldW2ogLSAxXV1baiAtIDFdKTsKICAgICAgICB9CiAgICBmb3IgKEVkZ2UgZSA6IG5vdEluTVNUKQogICAgewogICAgICAgIGludCB4ID0gZS54OwogICAgICAgIGludCB5ID0gZS55OwogICAgICAgIGxsIHcgPSBlLnc7CiAgICAgICAgaW50IGxjYSA9IGdldExDQSh4LCB5KTsKICAgICAgICBhbnMgPSBtYXgoYW5zLCBtYXgoZ2V0bXgoeCwgbGNhKSwgZ2V0bXgoeSwgbGNhKSkgKyB3KTsKICAgIH0KICAgIGNvdXQgPDwgYW5zOwp9Cg==