#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); ++ i)
#define per(i, a, b) for(int i = (a); i >= (b); -- i)
typedef long long ll;
typedef unsigned long long ull;
const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;
int n, m, dis1[N], dis[N][2], st, ed, dlen = -INF, ans = -INF;
bool vis[N];
struct edge {
int to, we;
};
vector<edge> g[N];
int bfs(int x) {
int pt;
memset(dis1, 0, sizeof(dis1));
memset(vis, 0, sizeof(vis));
queue<int> q; q.push(x); vis[x] = true;
while(!q.empty()) {
int u = q.front(); q.pop();
for(int i = 0; i < (int)g[u].size(); ++ i) {
int v = g[u][i].to, w = g[u][i].we;
if(!vis[v]) {
q.push(v); vis[v] = true;
dis1[v] = min(dis1[v], dis1[u] + w);
}
}
}
rep(i, 1, n) if(dis1[i] >= dlen) dlen = dis1[i], pt = i;
return pt;
}
void dfs(int u, int fa, int type) {
for(int i = 0; i < (int)g[u].size(); ++ i) {
int v = g[u][i].to, w = g[u][i].we;
if(v != fa) {
dis[v][type] = min(dis[v][type], dis[u][type] + w);
dfs(v, u, type);
}
}
}
void solve() {
cin >> n >> m;
rep(i, 1, m) {
int u, v, w; cin >> u >> v >> w;
g[u].emplace_back(v), g[v].emplace_back(u);
}
st = bfs(1), ed = bfs(st);
dfs(st, 0, 0), dfs(ed, 0, 1);
rep(i, 1, n) ans = max(ans, min(dis[i][0], dis[i][1]));
ans += dlen; cout << ans;
return;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
while(T --) solve();
return 0;
}