#include<bits/stdc++.h>
#define endl '\n'
#define INF 1000000000
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
int n,m;
int g0[110][110];
vector<int> g[110];
int dijkstra(int s,int t)
{
priority_queue<pii,vector<pii>,greater<pii>> q;
q.push(make_pair(0,s));
int dis[110];
for(int i=1;i<=n;i++)
dis[i]=INF;
dis[s]=0;
while(!q.empty())
{
int i=q.top().second;
if(q.top().first>dis[i])
{ q.pop(); continue; }
q.pop();
if(i==t)return dis[i];
for(int j:g[i])
if(!(i==s&&j==t || i==t&&j==s) && dis[i]+g0[i][j]<dis[j])
{
dis[j]=dis[i]+g0[i][j];
q.push(make_pair(dis[i]+g0[i][j],j));
}
dis[i]=0;
}
return INF;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
//input
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g0[i][j]=INF;
for(int i=0;i<m;i++)
{
int a,b,c;
cin>>a>>b>>c;
if(g0[a][b]==INF)
{
g[a].push_back(b);
g[b].push_back(a);
}
g0[a][b]=g0[b][a]=min(g0[a][b],c);
}
//solve
int ans=INF;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
ans=min(ans,dijkstra(i,j)+g0[i][j]);
if(ans!=INF) cout<<ans<<endl;
else cout<<"No solution."<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBJTkYgMTAwMDAwMDAwMAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHBpaTsKaW50IG4sbTsKaW50IGcwWzExMF1bMTEwXTsKdmVjdG9yPGludD4gZ1sxMTBdOwppbnQgZGlqa3N0cmEoaW50IHMsaW50IHQpCnsKCXByaW9yaXR5X3F1ZXVlPHBpaSx2ZWN0b3I8cGlpPixncmVhdGVyPHBpaT4+IHE7CglxLnB1c2gobWFrZV9wYWlyKDAscykpOwoJaW50IGRpc1sxMTBdOwoJZm9yKGludCBpPTE7aTw9bjtpKyspCgkJZGlzW2ldPUlORjsKCWRpc1tzXT0wOwoJd2hpbGUoIXEuZW1wdHkoKSkKCXsKCQlpbnQgaT1xLnRvcCgpLnNlY29uZDsKCQlpZihxLnRvcCgpLmZpcnN0PmRpc1tpXSkKCQl7IHEucG9wKCk7IGNvbnRpbnVlOyB9CgkJcS5wb3AoKTsKCQlpZihpPT10KXJldHVybiBkaXNbaV07CiAgICAgICAgZm9yKGludCBqOmdbaV0pCiAgICAgICAgICAgIGlmKCEoaT09cyYmaj09dCB8fCBpPT10JiZqPT1zKSAmJiBkaXNbaV0rZzBbaV1bal08ZGlzW2pdKQoJCQl7CgkJCQlkaXNbal09ZGlzW2ldK2cwW2ldW2pdOwoJCQkJcS5wdXNoKG1ha2VfcGFpcihkaXNbaV0rZzBbaV1bal0saikpOwoJCQl9CgkJZGlzW2ldPTA7Cgl9CglyZXR1cm4gSU5GOwp9CmludCBtYWluKCkKewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oMCk7CgljaW4udGllKDApOwoKCS8vaW5wdXQKCWNpbj4+bj4+bTsKCWZvcihpbnQgaT0xO2k8PW47aSsrKQoJCWZvcihpbnQgaj0xO2o8PW47aisrKQoJCQlnMFtpXVtqXT1JTkY7Cglmb3IoaW50IGk9MDtpPG07aSsrKQoJewoJCWludCBhLGIsYzsKCQljaW4+PmE+PmI+PmM7CgkJaWYoZzBbYV1bYl09PUlORikKCQl7CgkJCWdbYV0ucHVzaF9iYWNrKGIpOwoJCQlnW2JdLnB1c2hfYmFjayhhKTsKCQl9CgkJZzBbYV1bYl09ZzBbYl1bYV09bWluKGcwW2FdW2JdLGMpOwoJfQoKICAgIC8vc29sdmUKICAgIGludCBhbnM9SU5GOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspCgkJZm9yKGludCBqPWkrMTtqPD1uO2orKykKCQkJYW5zPW1pbihhbnMsZGlqa3N0cmEoaSxqKStnMFtpXVtqXSk7CglpZihhbnMhPUlORikgY291dDw8YW5zPDxlbmRsOwoJZWxzZSBjb3V0PDwiTm8gc29sdXRpb24uIjw8ZW5kbDsKfQo=