#include <iostream>
#include <algorithm>
using namespace std;
const int inf = 1012345678;
int N, M, a[114], b[114], c[114], g[19][19], sum[32777], val[32777], dp[19][32777], dp2[32777];
int main() {
	cin >> N >> M;
	int all_cost = 0;
	for (int i = 0; i < M; i++) {
		cin >> a[i] >> b[i] >> c[i]; a[i]--, b[i]--;
		sum[(1 << a[i]) + (1 << b[i])] += c[i];
		g[a[i]][b[i]] = g[b[i]][a[i]] = c[i];
		all_cost += c[i];
	}
	for (int i = 0; i < M; i++) {
		for (int j = i + 1; j < M; j++) {
			if (c[i] < c[j]) {
				swap(a[i], a[j]);
				swap(b[i], b[j]);
				swap(c[i], c[j]);
			}
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 1 << N; j++) {
			dp[i][j] = -inf;
		}
	}
	dp[0][1] = 0;
	for (int i = 3; i < 1 << N; i += 2) {
		for (int j = 0; j < N; j++) {
			if (i & (1 << j)) {
				int sb = i - (1 << j);
				for (int k = 0; k < N; k++) {
					if ((sb & (1 << k)) && g[j][k] != 0) {
						dp[j][i] = max(dp[j][i], dp[k][sb] + g[j][k]);
					}
				}
			}
		}
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 1 << N; j++) {
			if (!(j & (1 << i))) {
				sum[j + (1 << i)] += sum[j];
			}
		}
	}
	int ret = 0;
	for (int i = 0; i < 1 << N; i++) {
		if ((i & 1) && (i & (1 << (N - 1)))) {
			int sb = (1 << N) - i - 1;
			for (int j = sb; j >= 0; j--) {
				j &= sb;
				val[j] = 0;
				for (int k = 0; k < N; k++) {
					if (i & (1 << k)) {
						val[j] = max(val[j], sum[j + (1 << k)]);
					}
				}
			}
			dp2[0] = 0;
			for (int j = sb; j >= 0; j--) {
				j &= sb;
				if (j == sb) continue;
				int rj = sb - j;
				dp2[rj] = 0;
				for (int k = rj; k > 0; k = (k - 1) & rj) {
					dp2[rj] = max(dp2[rj], dp2[rj - k] + val[k]);
				}
			}
			ret = max(ret, dp2[sb] + dp[N - 1][i]);
		}
	}
	cout << all_cost - ret << endl;
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define D isdigit(c=getchar())
inline int getint(){
    int c,l=0,x;
    for (;!D;l=c)if(c==EOF)return 1<<31;
    for (x=c-'0';D;x=x*10+c-'0')if(c==EOF) break;
    return l=='-'?-x:x;
}
int dist[16][16],f[1<<16],dp[16][1<<16],g[1<<16][16],n,m;
int main(){
	n=getint();m=getint();
	for(int i=1;i<=m;i++){
		int x=getint(),y=getint();
		dist[x][y]=dist[y][x]=getint();
	}
	for(int i=0;i<(1<<n);i++)
		for(int j=1;j<=n;j++)
			for(int k=1;k<=n;k++)
				if((i&(1<<j-1))&&(!(i&(1<<k-1))))f[i]+=dist[j][k];
	memset(dp,0x3f,sizeof(dp));
	for(int i=0;i<(1<<n);i++)
		if(i&1){
			dp[1][i]=f[i];
			for(int j=1;j<=n;j++)if(dist[1][j])g[i][j]=1;
		}
	for(int i=1;i<(1<<n);i++)if(i&1){
		for(int k=2;k<=n;k++)if(i&(1<<k-1)){
			for(int j=i-(1<<k-1);j;j=j-1&i-(1<<k-1))if(j&1){
				int l=g[j][k];if(!l)continue;
				dp[k][i]=min(dp[k][i],dp[l][j]-2*dist[l][k]+f[i-j]);
			}
		//	printf("dp[%d][%d]=%d\n",k,i,dp[k][i]);
		}
		for(int k=1;k<=n;k++){
			int mx=0x3f3f3f3f;g[i][k]=0;
			for(int l=1;l<=n;l++)if(i&(1<<l-1)&&dist[l][k]&&dp[l][i]-2*dist[l][k]<mx){
				mx=dp[l][i]-2*dist[l][k];g[i][k]=l;
			}
		}
	}
	printf("%d\n",dp[n][(1<<n)-1]/2);
	return 0;
}
//MainFunction
