#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;
}
