/*
1.删边法:把边删去后,查找最小值
2.floyd:
首先是肯定枚举到了所有的组合
无向图最小环,先确定两个点之间的最短路,并且一定没有经过第三个点,然后在以经过第三个点
*/
#include <bits/stdc++.h>
using namespace std;
const int N=110,inf=1e8;
int n,m;
int g[N][N],dis[N][N];
int ans=inf;
void floyd() {
for(int k=1;k<=n;k++) {
for(int i=1;i<k;i++)for(int j=i+1;j<k;j++)
ans=min(ans,dis[i][j]+g[j][k]+g[k][i]);
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
dis[i][j]=dis[j][i]=min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
int main() {
cin>>n>>m;
for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)g[i][j]=inf;
for(int i=1;i<=n;i++)g[i][i]=0;
while(m--) {
int x,y,wi;
cin>>x>>y>>wi;
g[x][y]=g[y][x]=min(g[x][y],wi);
}
memcpy(dis,g,sizeof(g));
floyd();
if(ans==inf)puts("No solution.");
else cout<<ans<<endl;
return 0;
}