#include #include #include #include #include #include #define LL long long #define REP(i, n) for(int i = 0;i < (int)(n);i++) #define ALL(x) (x).begin(),(x).end() using namespace std; int n, m; int edge[100][100]; int scores[100]; int solve(vector pos) { vector local_scores(pos.size()); REP(i, local_scores.size()) { local_scores[i] = scores[i]; } int res = 0; for(int i = pos[pos.size() - 1] + 1;i < n;i++) { int min_score = 1 << 30; REP(j, pos.size()) { int cur = edge[i][pos[j]]; if(cur == 0) { min_score = 0; break; } if(min_score > cur) { min_score = cur; } } if(min_score) { //cout << i << " " << min_score << endl; int score = min_score; REP(k, pos.size()) { score += (scores[k] = min(scores[k], edge[i][pos[k]])); } scores[pos.size()] = min_score; res = max(res, score); pos.push_back(i); res = max(solve(pos), res); pos.pop_back(); REP(k, local_scores.size()) { scores[k] = local_scores[k]; } } } return res; } int main(){ while(cin >> n >> m) { memset(edge, 0, sizeof(edge)); REP(i,m) { int u, v, f; cin >> u >> v >> f; edge[u-1][v-1] = edge[v-1][u-1] = f; } int res = 0; vector pos(2); REP(i,n) { REP(j,i) { if(edge[i][j]) { pos[0] = j; pos[1] = i; scores[0] = scores[1] = edge[i][j]; res = max(res, edge[i][j] * 2); res = max(res, solve(pos)); } } } cout << res << endl; } }