#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
struct Edge {
int f, t, v;
}edge[N];
int n;
int cnt;
int value;
int maxValue,maxValueIndex;
vector<int> vis;
vector<int> occurrences;
void dfs(int edgeNum)
{
bool flag = false;
vis[edgeNum] = 1;
++occurrences[edge[edgeNum].f];
++occurrences[edge[edgeNum].t];
value += edge[edgeNum].v;
for(int i = 1; i <= cnt; ++i)
{
if((edge[edgeNum].f == edge[i].f || edge[edgeNum].f == edge[i].t || edge[edgeNum].t == edge[i].f || edge[edgeNum].t == edge[i].t) && vis[i] == 0 && occurrences[edge[i].f] < 2 && occurrences[edge[i].t] < 2)
{
flag = true;
dfs(i);
}
}
if(!flag)
{
if(value > maxValue)
{
maxValue = value;
maxValueIndex = edgeNum;
}
}
vis[edgeNum] = 0;
--occurrences[edge[edgeNum].f];
--occurrences[edge[edgeNum].t];
value -= edge[edgeNum].v;
}
int main()
{
cin >> n;
vis = vector<int>(n + 10, 0);
occurrences = vector<int>(n + 10, 0);
cnt = 0;
int begin, end, v;
for(int i = 0; i < n - 1; ++i)
{
cin >> begin >> end >> v;
edge[++cnt].f = begin;
edge[cnt].t = end;
edge[cnt].v = v;
}
maxValue = 0;
dfs(1);
dfs(maxValueIndex);
cout << (maxValue * maxValue + 21 * maxValue) / 2 << endl;
return 0;
}
06-08
08-16