#include
#include
#include
using namespace std;
vector > graph[105];
int dp[20][1 << 20];
int travelling_salesman(int node, int visited) {
if(__builtin_popcount(visited) == 1) {
for(int i = 0; i < graph[node].size(); i++) {
if(graph[node][i].first == 0) {
return graph[node][i].second;
}
}
return 0;
}
if(node == 0 and visited == 0) {
return 0;
}
if(dp[node][visited] != -1) {
return dp[node][visited];
}
int new_mask = visited;
new_mask -= (1 << node);
int result = 2e9;
for(int i = 0; i < graph[node].size(); i++) {
int sosed = graph[node][i].first;
int weight = graph[node][i].second;
if(visited & (1 << sosed)) {
result = min(result, travelling_salesman(sosed, new_mask) + weight);
}
}
return dp[node][visited] = result;
}
int main() {
int n, m;
cin >> n >> m;
memset(dp, -1, sizeof dp);
for(int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
a--; b--;
graph[a].push_back(make_pair(b, c));
graph[b].push_back(make_pair(a, c));
}
int mask = (1 << (n)) - 1;
cout << travelling_salesman(0, mask) << endl;
return 0;
}
/*
4 6
1 2 10
2 4 25
2 3 35
3 4 30
3 1 15
4 1 20
*/