#include <bits/stdc++.h>
using namespace std;
const int Maxn = 200005;
const int LOG = 19;
int n, m, tot;
int dfn[Maxn], finish[Maxn];
int par[LOG + 1][Maxn], dep[Maxn];
int dp[Maxn];
struct node {
  int x, y, w;
};
vector<node> v[Maxn];
struct Edge {
  int to, next;
} e[Maxn << 1];
int head[Maxn], _cnt;
inline void add_edge(int u, int v) {
  e[++_cnt] = (Edge){v, head[u]};
  head[u] = _cnt;
}
void dfs(int u) {
  dfn[u] = ++tot;
  dep[u] = dep[par[0][u]] + 1;
  for (int i = head[u]; i; i = e[i].next) dfs(e[i].to);
  finish[u] = tot;
}
inline int get_lca(int u, int v) {
  if (dep[u] < dep[v]) swap(u, v);
  if (dep[u] > dep[v])
    for (int i = LOG; ~i; --i)
      if (dep[par[i][u]] >= dep[v]) u = par[i][u];
  if (u == v) return u;
  for (int i = LOG; ~i; --i)
    if (par[i][u] != par[i][v]) u = par[i][u], v = par[i][v];
  return par[0][u];
}
int bit[Maxn];
inline int query(int i) {
  int res = 0;
  for (; i; i -= i & -i) res += bit[i];
  return res;
}
inline void _add(int i, int val) {
  for (; i < Maxn; i += i & -i) bit[i] += val;
}
inline void range_add(int l, int r, int val) {
  _add(l, val), _add(r + 1, -val);
}
inline int query(int u, int v, int lca) {
  return query(dfn[u]) + query(dfn[v]) - query(dfn[lca]);
}
void dfs2(int u) {
  int now = 0;
  for (int i = head[u]; i; i = e[i].next) dfs2(e[i].to), now += dp[e[i].to];
  dp[u] = now;
  for (int i = 0; i < v[u].size(); ++i) {
    int x = v[u][i].x, y = v[u][i].y;
    dp[u] = max(dp[u], query(x, y, u) + now + v[u][i].w);
  }
  range_add(dfn[u], finish[u], now - dp[u]);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 2; i <= n; ++i) scanf("%d", par[0] + i), add_edge(par[0][i], i);
  dfs(1);
  for (int i = 1; i <= LOG; ++i)
    for (int j = 1; j <= n; ++j) par[i][j] = par[i - 1][par[i - 1][j]];
  for (int i = 1; i <= m; ++i) {
    int u, v, w;
    scanf("%d %d %d", &u, &v, &w);
    ::v[get_lca(u, v)].push_back((node){u, v, w});
  }
  dfs2(1);
  printf("%d\n", dp[1]);
  return 0;
}
