#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
typedef long long LL;
const int N = 100100, M = 300300, INF = 0x3f3f3f3f;
int idx, n, m;
vector<PII> G[N];
int dis1[N][17], dis2[N][17], fa[N][17];
int depth[N];
int f[N];
struct edge{
int a, b, w;
bool used = false;
bool operator <(const edge &t)const{
return w<t.w;
}
} e[M];
void add(int a, int b, int w){
G[a].push_back({w,b});
}
int find(int x){
return f[x]==x?x:f[x]=find(f[x]);
}
LL kruskal(){
LL ans = 0;
sort(e,e+idx);
for(int i=0;i<idx;i++){
int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
if(a!=b){
f[a] = b;
e[i].used = true;
ans+=w;
}
}
return ans;
}
void build(){
for(int i=0;i<m;i++){
if(e[i].used){
add(e[i].a,e[i].b,e[i].w);
add(e[i].b,e[i].a,e[i].w);
}
}
}
void bfs(){
memset(depth,0x3f,sizeof depth);
depth[0] = 0;
depth[1] = 1;
queue<int> q;
q.push(1);
while(!q.empty()){
int t = q.front();
q.pop();
for(int i=0;i<G[t].size();i++){
int j = G[t][i].y, w = G[t][i].x;
if(depth[j]>depth[t]+1){
depth[j] = depth[t]+1;
q.push(j);
dis1[j][0] = w, dis2[j][0] = -INF;
fa[j][0] = t;
for(int k=1;k<=16;k++){
int anc = fa[j][k-1];
fa[j][k] = fa[anc][k-1];
int dist[4] = {dis1[j][k-1],dis1[anc][k-1],dis2[j][k-1],dis2[anc][k-1]};
dis1[j][k] = -INF, dis2[j][k] = -INF;
for(int l=0;l<4;l++){
if(dist[l]>dis1[j][k]) dis2[j][k] = dis1[j][k], dis1[j][k] = dist[l];
else if(dist[l]!=dis1[j][k]&&dist[l]>dis2[j][k]){
dis2[j][k] = dist[l];
}
}
}
}
}
}
}
int lca(int a, int b, int w){
static int dist[2*N];
int cnt = 0;
if(depth[a]<depth[b]) swap(a,b);
for(int k=16;k>=0;k--){
if(depth[fa[a][k]]>=depth[b]){
dist[cnt++] = dis1[a][k];
dist[cnt++] = dis2[a][k];
a = fa[a][k];
}
}
if(a!=b){
for(int k=16;k>=0;k--){
if(fa[a][k]!=fa[b][k]){
dist[cnt++] = dis1[a][k];
dist[cnt++] = dis1[b][k];
dist[cnt++] = dis2[a][k];
dist[cnt++] = dis2[b][k];
a = fa[a][k], b = fa[b][k];
}
}
dist[cnt++] = dis1[a][0];
dist[cnt++] = dis1[b][0];
}
int dist1 = -INF, dist2 = -INF;
for(int i=0;i<cnt;i++){
int d = dist[i];
if(d>dist1) dist2 = dist1, dist1 = d;
else if(d!=dist1&&d>dist2) dist2 = d;
}
if(w>dist1) return w-dist1;
if(w!=dist1&&w>dist2) return w-dist2;
return INF;
}
int main(){
cin>>n>>m;
int a, b, w;
for(int i=1;i<=n;i++){
f[i] = i;
}
for(int i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&w);
if(a!=b){
e[idx++] = {a,b,w};
}
}
LL su = kruskal();
//cout<<su<<endl;
build();
bfs();
LL ans = 1e18;
for(int i=0;i<idx;i++){
if(!e[i].used){
int p = lca(e[i].a, e[i].b, e[i].w);
ans = min(ans,su+p);
}
}
cout<<ans<<endl;
return 0;
}