#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
vector<int> G[N], a[N];
int n, m, fa[N][21], s[N], t[N], w[N], L[N], R[N], tot;
int dep[N], dp[N], c[N];
void dfs(int u) {
  L[u] = ++tot;
  dep[u] = dep[fa[u][0]] + 1;
  for (int i = 1; i < 21; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  for (int i = 0; i < G[u].size(); i++) dfs(G[u][i]);
  R[u] = tot;
}
int lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  for (int i = 20; i >= 0; i--)
    if (dep[fa[u][i]] >= dep[v]) u = fa[u][i];
  if (u == v) return u;
  for (int i = 20; i >= 0; i--)
    if (fa[u][i] != fa[v][i]) {
      u = fa[u][i];
      v = fa[v][i];
    }
  return fa[u][0];
}
void update(int x, int y) {
  for (; x <= n; x += (x & (-x))) c[x] += y;
}
void merge(int x, int y, int z) {
  update(x, z);
  update(y + 1, -z);
}
int ask(int x) {
  int res = 0;
  for (; x; x -= (x & (-x))) res += c[x];
  return res;
}
void solve(int u) {
  int res = 0;
  for (int i = 0; i < G[u].size(); i++) {
    solve(G[u][i]);
    res += dp[G[u][i]];
  }
  dp[u] = res;
  for (int i = 0; i < a[u].size(); i++) {
    int v = a[u][i];
    dp[u] = max(dp[u], ask(L[s[v]]) + ask(L[t[v]]) + res + w[v]);
  }
  merge(L[u], R[u], res - dp[u]);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) {
    scanf("%d", &fa[i][0]);
    G[fa[i][0]].push_back(i);
  }
  dfs(1);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &s[i], &t[i], &w[i]);
    a[lca(s[i], t[i])].push_back(i);
  }
  solve(1);
  printf("%d\n", dp[1]);
  return 0;
}
