Problem: Mole decided to live in an abandoned mine. The structure of the mine is represented by a simple connected undirected graph which consists of N vertices numbered 1 through N and M edges. The i-th edge connects Vertices a_i and b_i, and it costs c_i yen (the currency of Japan) to remove it.

Mole would like to remove some of the edges so that there is exactly one path from Vertex 1 to Vertex N that does not visit the same vertex more than once. Find the minimum budget needed to achieve this.

Constraints

* 2 \leq N \leq 15
* N-1 \leq M \leq N(N-1)/2
* 1 \leq a_i, b_i \leq N
* 1 \leq c_i \leq 10^{6}
* There are neither multiple edges nor self-loops in the given graph.
* The given graph is connected.

Input

Input is given from Standard Input in the following format:


N M
a_1 b_1 c_1
:
a_M b_M c_M


Output

Print the answer.

Examples

Input

4 6
1 2 100
3 1 100
2 4 100
4 3 100
1 4 100
3 2 100


Output

200


Input

2 1
1 2 1


Output

0


Input

15 22
8 13 33418
14 15 55849
7 10 15207
4 6 64328
6 9 86902
15 7 46978
8 14 53526
1 2 8720
14 12 37748
8 3 61543
6 5 32425
4 11 20932
3 12 55123
8 2 45333
9 12 77796
3 9 71922
12 15 70793
2 4 25485
11 6 1436
2 7 81563
7 11 97843
3 1 40491


Output

133677

Solution (in CPP):

Solution:
#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