Problem:
Score : 900 points

Problem Statement

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.

Sample Input 1

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

Sample Output 1

200

By removing the two edges represented by the red dotted lines in the figure below, the objective can be achieved for a cost of 200 yen.

Sample Input 2

2 1
1 2 1

Sample Output 2

0

It is possible that there is already only one path from Vertex 1 to Vertex N in the beginning.

Sample Input 3

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

Sample Output 3

133677

Solution in C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h> 
using namespace std;

#define sz(x) (int)x.size() 
#define pb push_back 
#define mp make_pair 
#define fi(a, b) for(int i=a; i<=b; i++) 
#define fj(a, b) for(int j=a; j<=b; j++) 
#define fo(a, b) for(int o=a; o<=b; o++) 
#define fdi(a, b) for(int i=a; i>=b; i--) 
#define fdj(a, b) for(int j=a; j>=b; j--) 
#define fdo(a, b) for(int o=a; o>=b; o--) 

#ifdef LOCAL
#define err(...) fprintf(stderr, __VA_ARGS__)
#else
#define err(...) while(false) {}
#endif

typedef long long ll; 
typedef pair<int, int> pii; 
typedef pair<ll, ll> pll; 
typedef vector<int> vi; 
typedef vector<ll> vll;
typedef vector<pii> vpii; 
typedef vector<pll> vpll; 
typedef long double ld;
typedef unsigned long long ull;

/////////////////////////////////

int const MAX = 15;

int n, m;
int e[MAX][MAX];

int d1[(1 << MAX)];
int d2[(1 << MAX)][MAX];

bool bit(int m, int i) {
	return (1 & (m >> i));
}

void init() {
	for (int mask = 0; mask < (1 << n); mask++) {
		fi(0, n - 1) {
			fj(i + 1, n - 1) {
				if (bit(mask, i) && bit(mask, j)) {
					d1[mask] += e[i][j];
				}
			}
		}
	}

	for (int mask = 0; mask < (1 << n); mask++) {
		fo(0, n - 1) {
			fi(0, n - 1) {
				if (bit(mask, i)) {
					d2[mask][o] += e[i][o];
				}
			}
		}
	}
}

int d[(1 << MAX)][MAX];
int const INF = 1e9 + 41;

int ans;
int sum;

int getbest(int comp, int path) {
	int res = 0;

	fi(0, n - 1) {
		if (bit(path, i)) {
			res = max(res, d2[comp][i]);
		}
	}
	
	res += d1[comp];
	return res;
}

void solve() {
	init();
	for (int mask = 0; mask < (1 << n); mask++) {
		fo(0, n - 1) {
			d[mask][o] = -INF;
		}
	}
	d[(1 << (n - 1)) - 1][n - 1] = 0;

	for (int mask = (1 << n) - 1; mask > 0; mask--) {
		fo(0, n - 1) {
			if (d[mask][o] < 0) continue;
			fi(0, n - 1) {
				if (e[i][o] && bit(mask, i)) {
					int nmask = (mask ^ (1 << i));
					d[nmask][i] = max(d[nmask][i], d[mask][o] + e[i][o]);
				}
			}
			int sm = mask;
			while (sm > 0) {
				int nmask = (mask ^ sm);
				int pathmask = ( ((1 << n) - 1) ^ mask);
				int bs = getbest(sm, pathmask);
				d[nmask][o] = max(d[nmask][o], d[mask][o] + bs);
				sm = ((sm - 1) & mask);
			}
		}
	}

	ans = sum - d[0][0];
	err("d = %d sum = %d\n", d[0][0], sum);
	printf("%d\n", ans);
}

int main() {
#ifdef LOCAL
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif

  scanf("%d %d", &n, &m);
  fi(1, m) {
  	int x, y, w;
  	scanf("%d %d %d", &x, &y, &w);
  	x--;
  	y--;
  	e[x][y] = e[y][x] = w;
  	sum += w;
  }
	solve();		

	
#ifdef LOCAL
	err("ELAPSED TIME: %.3Lf\n", (ld) clock() / CLOCKS_PER_SEC);
#endif	
	
	return 0;
}