#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, lp, c;
} tk[200005];
int n, m, x, f[20][200005], tot = 0, dep[200005], tr[200005], dfn[200005],
                            ed[200005];
int y, z, ans = 0, a[200005], sum = 0, res;
vector<int> s[200005];
int lowbit(int p) { return p & -p; }
int ask(int p) {
  int ans = 0;
  while (p) {
    ans += tr[p];
    p -= lowbit(p);
  }
  return ans;
}
void modify(int p, int v) {
  while (p <= n) {
    tr[p] += v;
    p += lowbit(p);
  }
}
void add(int l, int r, int v) {
  modify(l, v);
  modify(r + 1, -v);
}
void predfs(int p, int ff) {
  dfn[p] = ed[p] = ++tot;
  f[0][p] = ff;
  dep[p] = dep[ff] + 1;
  int v;
  for (int i = 0; i < s[p].size(); i++) {
    v = s[p][i];
    predfs(v, p);
    ed[p] = ed[v];
  }
}
int lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 19; i >= 0; i--)
    if (dep[f[i][x]] >= dep[y]) x = f[i][x];
  if (x == y) return x;
  for (int i = 19; i >= 0; i--)
    if (f[i][x] != f[i][y]) x = f[i][x], y = f[i][y];
  return f[0][x];
}
bool cmp(node a, node b) { return dep[a.lp] > dep[b.lp]; }
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) scanf("%d", &x), s[x].push_back(i);
  predfs(1, 0);
  for (int i = 1; i < 20; i++)
    for (int j = 1; j <= n; j++) f[i][j] = f[i - 1][f[i - 1][j]];
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &tk[i].x, &tk[i].y, &tk[i].c);
    tk[i].lp = lca(tk[i].x, tk[i].y);
  }
  sort(tk + 1, tk + m + 1, cmp);
  for (int i = 1; i <= m; i++) {
    sum = ask(dfn[tk[i].x]) - a[tk[i].lp];
    sum += ask(dfn[tk[i].y]);
    if (sum < tk[i].c) {
      res = tk[i].c - sum;
      a[tk[i].lp] += res;
      ans += res;
      add(dfn[tk[i].lp], ed[tk[i].lp], res);
    }
  }
  printf("%d\n", ans);
  return 0;
}
