#include <bits/stdc++.h>
using namespace std;
int n, m, dt[200200], ft[200200], T, dp[200200], fa[200200][22], id[200200];
vector<int> v[200200];
long long f[200200];
struct dat {
  int a, b, c;
};
vector<dat> e[200200];
void dfs(int x, int p = 0) {
  dt[x] = ++T;
  fa[x][0] = p;
  for (int i = 1; i <= 18; i++) fa[x][i] = fa[fa[x][i - 1]][i - 1];
  for (int i = 0; i < v[x].size(); i++) {
    int y = v[x][i];
    if (y == p) continue;
    dp[y] = dp[x] + 1;
    dfs(y, x);
  }
  ft[x] = T;
}
int anc(int x, int d) {
  if (!d) return x;
  for (int i = 31 - __builtin_clz(d); i >= 0; i--)
    if (d & (1 << i)) x = fa[x][i];
  return x;
}
int lca(int x, int y) {
  if (dp[x] > dp[y])
    x = anc(x, dp[x] - dp[y]);
  else if (dp[y] > dp[x])
    y = anc(y, dp[y] - dp[x]);
  if (x == y) return x;
  for (int i = 31 - __builtin_clz(dp[x]); i >= 0; i--) {
    if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
  }
  return fa[x][0];
}
long long sum[200200];
void add(int x, int val) {
  while (x <= n) sum[x] += val, x += x & -x;
}
long long calc(int x) {
  long long rlt = 0;
  while (x) rlt += sum[x], x -= x & -x;
  return rlt;
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 2, p; i <= n; i++) scanf("%d", &p), v[p].push_back(i);
  dfs(1);
  while (m--) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    e[lca(a, b)].push_back({a, b, c});
  }
  for (int i = 1; i <= n; i++) id[dt[i]] = i;
  for (int i = n; i >= 1; i--) {
    int x = id[i];
    long long rlt = 0;
    for (int j = 0; j < v[x].size(); j++) rlt += f[v[x][j]];
    f[x] = rlt;
    for (int j = 0; j < e[x].size(); j++) {
      int a = e[x][j].a, b = e[x][j].b, c = e[x][j].c;
      f[x] = max(f[x], rlt - calc(dt[a]) - calc(dt[b]) + c);
    }
    add(dt[x], f[x] - rlt);
    add(ft[x] + 1, rlt - f[x]);
  }
  printf("%I64d\n", f[1]);
  return 0;
}
