func_code_string: #include <bits/stdc++.h>   using namespace std;   const int Dian = 200005;   const int Bian = Dian * 2;   const int M = Dian;   const int Segment_Size = Dian * 4;   int fir[Dian], ne[Bian], to[Bian], cnt, n, m;   int dp[Dian], depth[Dian], fa[Dian], Bigson[Dian], top[Dian], S[Dian],       dep[Dian], info[Dian];   struct One {     int from, to, C, LCA;   } Road[M];   vector<One> G[Dian];   void add(int x, int y) {     ne[++cnt] = fir[x];     fir[x] = cnt;     to[cnt] = y;   }   void link(int x, int y) {     add(x, y);     add(y, x);   }   void getinfo(int x, int f) {     S[x] = 1;     dep[x] = dep[f] + 1;     int mx = -1;     for (int i = fir[x]; i; i = ne[i]) {       int V = to[i];       if (V == f) continue;       getinfo(V, x);       if (S[V] > mx) Bigson[x] = V, mx = S[V];       S[x] += S[V];     }   }   void getidx(int x, int T) {     top[x] = T;     if (Bigson[x]) getidx(Bigson[x], T);     for (int i = fir[x]; i; i = ne[i]) {       int V = to[i];       if (V == fa[x] || V == Bigson[x]) continue;       getidx(V, V);     }   }   int LCA(int x, int y) {     while (top[x] != top[y]) {       if (dep[top[x]] < dep[top[y]]) swap(x, y);       x = fa[top[x]];     }     if (dep[y] < dep[x]) return y;     return x;   }   void read(void) {     scanf( %d%d , &n, &m);     for (int i = 2; i <= n; i++) {       scanf( %d , &fa[i]);       link(i, fa[i]);     }     getinfo(1, 0);     getidx(1, 1);     for (int i = 1; i <= m; i++) {       scanf( %d%d%d , &Road[i].from, &Road[i].to, &Road[i].C);       Road[i].LCA = LCA(Road[i].from, Road[i].to);       G[Road[i].LCA].push_back(Road[i]);     }   }   int getans(One Query) {     int x = Query.from, y = Query.to, now = Query.C;     while (top[x] != top[y]) {       if (dep[top[x]] < dep[top[y]]) swap(x, y);       now = now + info[top[x]] - info[Bigson[x]];       x = fa[top[x]];     }     if (dep[x] > dep[y]) swap(x, y);     now = now + info[x] - info[Bigson[y]];     return now;   }   int dfs(int x, int f) {     int sum = 0;     for (int i = fir[x]; i; i = ne[i]) {       int V = to[i];       if (V == f) continue;       sum += dfs(V, x);     }     info[x] = info[Bigson[x]] + sum;     dp[x] = sum;     for (int i = 0; i < (int)G[x].size(); i++)       dp[x] = max(dp[x], getans(G[x][i]));     info[x] -= dp[x];     return dp[x];   }   void doit(void) { printf( %d n , dfs(1, 0)); }   int main(void) {     read();     doit();   }   