#include <bits/stdc++.h>
using namespace std;
int n, m;
int f[18][200005];
int x[200005], y[200005], c[200005], dep[200005];
vector<int> G[200005], E[200005];
int Lca(int x, int y) {
  if (dep[x] > dep[y]) swap(x, y);
  for (int i = 0; dep[y] > dep[x]; i++)
    if (dep[y] - dep[x] >> i & 1) y = f[i][y];
  if (x == y) return x;
  for (int i = 18 - 1; i >= 0; i--)
    if (f[i][x] != f[i][y]) x = f[i][x], y = f[i][y];
  return f[0][x];
}
int F[200005], g[200005], s[200005], h[200005];
int Find(int u) {
  if (!F[u]) return u;
  int t = F[u];
  F[u] = Find(t);
  if (F[u] ^ t) g[u] += g[t];
  return F[u];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++)
    scanf("%d", &f[0][i]), dep[i] = dep[f[0][i]] + 1, E[f[0][i]].push_back(i);
  for (int j = 1; j < 18; j++)
    for (int i = 1; i <= n; i++) f[j][i] = f[j - 1][f[j - 1][i]];
  for (int i = 1; i <= m; i++)
    scanf("%d%d%d", &x[i], &y[i], &c[i]), G[Lca(x[i], y[i])].push_back(i);
  for (int i = n; i >= 1; i--) {
    int t = 0;
    for (int j = 0; j < E[i].size(); j++) F[E[i][j]] = i;
    for (int j = 0; j < G[i].size(); j++) {
      Find(x[G[i][j]]), Find(y[G[i][j]]);
      t = max(t, c[G[i][j]] + g[x[G[i][j]]] + g[y[G[i][j]]]);
    }
    for (int j = 0; j < E[i].size(); j++) s[i] += h[E[i][j]];
    h[i] = t + s[i];
    g[i] = s[i] - h[i];
  }
  printf("%d\n", h[1]);
}
