#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 2;
const int logn = 20 + 2;
int n, m, root = 1;
int fr[maxn], to[maxn], w[maxn];
struct Edge {
  int to, nxt;
};
Edge edge[maxn];
int cnt, head[maxn];
void addedge(int u, int v) {
  cnt++;
  edge[cnt].to = v;
  edge[cnt].nxt = head[u];
  head[u] = cnt;
}
int tot;
int dep[maxn], L[maxn], R[maxn];
int fa[maxn][logn];
void dfs(int u, int father) {
  dep[u] = dep[father] + 1;
  fa[u][0] = father;
  for (int i = 1; (1 << i) <= dep[u]; i++) fa[u][i] = fa[fa[u][i - 1]][i - 1];
  L[u] = ++tot;
  for (int i = head[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].to;
    if (v == father) continue;
    dfs(v, u);
  }
  R[u] = tot;
}
int lg[maxn];
int LCA(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  while (dep[x] > dep[y]) x = fa[x][lg[dep[x] - dep[y]] - 1];
  if (x == y) return x;
  for (int i = lg[dep[x]] - 1; ~i; i--)
    if (fa[x][i] != fa[y][i]) {
      x = fa[x][i];
      y = fa[y][i];
    }
  return fa[x][0];
}
int tr[maxn];
struct Binary_Indexed_Tree {
  int lowbit(int x) { return x & -x; }
  void update(int x, int val) {
    while (x <= n) {
      tr[x] += val;
      x += lowbit(x);
    }
  }
  int query(int x) {
    int ret = 0;
    while (x) {
      ret += tr[x];
      x -= lowbit(x);
    }
    return ret;
  }
};
Binary_Indexed_Tree BIT;
int dp[maxn];
vector<int> vec[maxn];
void DP(int u, int father) {
  int sum = 0;
  for (int i = head[u]; ~i; i = edge[i].nxt) {
    int v = edge[i].to;
    if (v == father) continue;
    DP(v, u);
    sum += dp[v];
  }
  dp[u] = sum;
  for (int i = 0; i < vec[u].size(); i++) {
    int j = vec[u][i];
    dp[u] = max(dp[u], BIT.query(L[fr[j]]) + BIT.query(L[to[j]]) + sum + w[j]);
  }
  BIT.update(L[u], sum - dp[u]);
  BIT.update(R[u] + 1, dp[u] - sum);
}
void init() {
  cnt = 0;
  memset(head, -1, sizeof(head));
}
int main() {
  init();
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) {
    int p;
    scanf("%d", &p);
    addedge(p, i);
  }
  dfs(root, -1);
  for (int i = 1; i <= n; i++) lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &fr[i], &to[i], &w[i]);
    vec[LCA(fr[i], to[i])].push_back(i);
  }
  DP(root, -1);
  printf("%d", dp[root]);
  return 0;
}
