using System; using static System.Console; using System.Linq; using System.Collections.Generic; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (n, m) = (c[0], c[1]); var map = NArr(m); var tree = new List<(int to, int len)>[n]; var mtx = new int[n, n]; for (var i = 0; i < tree.Length; ++i) tree[i] = new List<(int to, int len)>(); foreach (var edge in map) { if (mtx[edge[0] - 1, edge[1] - 1] < edge[2]) { mtx[edge[0] - 1, edge[1] - 1] = edge[2]; mtx[edge[1] - 1, edge[0] - 1] = edge[2]; } } var bitmax = 1 << n; var INF = int.MinValue; var dp = new int[bitmax, n]; for (var b = 0; b < bitmax; ++b) for (var i = 0; i < n; ++i) dp[b, i] = INF; for (var i = 0; i < n; ++i) dp[1 << i, i] = 0; var ans = 0; for (var b = 2; b < bitmax; ++b) { for (var i = 0; i < n; ++i) { if (((b >> i) & 1) == 0) continue; for (var j = 0; j < n; ++j) { if (mtx[i, j] == 0) continue; var next = b | (1 << j); if (b == next) continue; dp[next, j] = Math.Max(dp[next, j], dp[b, i] + mtx[i, j]); ans = Math.Max(ans, dp[next, j]); } } } WriteLine(ans); } }