#include<bits/stdc++.h>
#define ll int
#define Il inline
#define Re register
#define mem(u,v) memset(u,v,sizeof(u))
#define rep(i,a,b) for(Re ll i=(a);i<=(b);i++)
#define drep(i,a,b) for(Re ll i=(a);i>=(b);i--)
#define go(u) for(ll i=head[u],v=e[i].to;i;i=e[i].pre,v=e[i].to)
#define _go(u) for(ll i=Head[u],v=E[i].to;i;i=E[i].nxt,v=E[i].to)
#define writesp(x) write(x),putchar(' ')
#define writeln(x) write(x),puts("")
using namespace std;
Il ll read(){ll sum=0,f=0;char ch=getchar();for(;!isdigit(ch);ch=getchar())f|=(ch=='-');for(;isdigit(ch);ch=getchar())sum=((sum<<1)+(sum<<3)+(ch^48));return f?-sum:sum;}
void write(const ll x){if(x<0){putchar('-');write(-x);return;}if(x>9)write(x/10);putchar(x%10+'0');}
char getc(){char ch=getchar();for(;!isalpha(ch);ch=getchar());return ch;}
#define N 1000010
ll n, m, head[100], tot, ans = 1e18;
struct edge{
ll pre, to, val;
}e[N];
void add(ll x, ll y, ll v){
e[++tot].pre = head[x];
e[tot].to = y;
e[tot].val = v;
head[x] = tot;
}
ll dfs(ll now, ll dep){
if(now + 1 == (1 << n))return 0;
ll sum = 1e18;
go(dep){
if((now & (1 << (v - 1))) == 0){
sum = min(ans, dfs(now | (1 << (v - 1)), v) + e[i].val);
}
}
return sum;
}
int main(){
while(scanf("%d %d", &n, &m)){
ans = 1e18;tot = 0;
memset(head, 0, sizeof(head));
ll x, y, v;
rep(i, 1, m){
x = read();
y = read();
v = read();
add(x, y, v);
add(y, x, v);
}
rep(i, 1, n){
ans = min(ans, dfs(1 << (i - 1), i));
}
if(ans == 1e18){
puts("-1");
continue;
}
writeln(ans);
}
}