#include <bits/stdc++.h>
using namespace std;
int n, m;
struct Edge {
  int to, next;
} e[200010 * 2];
int c1, head[200010];
inline void add_edge(int u, int v) {
  e[c1].to = v;
  e[c1].next = head[u];
  head[u] = c1++;
}
int in[200010], out[200010], bl[200010], dep[200010], F[200010][21];
void Dfs(int u, int fa) {
  static int cnt = 0;
  in[u] = ++cnt;
  bl[cnt] = u;
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa) continue;
    dep[v] = dep[u] + 1;
    F[v][0] = u;
    Dfs(v, u);
  }
  out[u] = cnt;
}
void init_lca() {
  for (int j = 1; j <= 20; ++j)
    for (int i = 1; i <= n; ++i) F[i][j] = F[F[i][j - 1]][j - 1];
}
int get_lca(int x, int y) {
  if (dep[x] < dep[y]) swap(x, y);
  for (int i = 20; ~i; --i)
    if (dep[F[x][i]] >= dep[y]) x = F[x][i];
  if (x == y) return x;
  for (int i = 20; ~i; --i)
    if (F[x][i] != F[y][i]) x = F[x][i], y = F[y][i];
  return F[x][0];
}
vector<tuple<int, int, int>> A[200010];
int Bit[200010][2];
void add(int i, int v, int o) {
  while (i <= n) Bit[i][o] += v, i += ((i) & (-i));
}
void update(int l, int r, int v, int o) {
  add(l, v, o);
  add(r + 1, -v, o);
}
int get_sum(int i, int o) {
  int s = 0;
  while (i) s += Bit[i][o], i -= ((i) & (-i));
  return s;
}
int f[200010], g[200010];
void dfs(int u, int fa) {
  for (int i = head[u]; ~i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa) continue;
    dfs(v, u);
    g[u] += f[v];
  }
  f[u] = g[u];
  for (auto t : A[u]) {
    int x, y, w;
    tie(x, y, w) = t;
    f[u] = max(f[u], g[u] + get_sum(in[x], 1) + get_sum(in[y], 1) -
                         get_sum(in[x], 0) - get_sum(in[y], 0) + w);
  }
  update(in[u], out[u], f[u], 0);
  update(in[u], out[u], g[u], 1);
}
int main() {
  fill(head, head + 200010, -1);
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cin >> n >> m;
  for (int i = 2; i <= n; ++i) {
    int x;
    cin >> x;
    add_edge(x, i);
  }
  dep[1] = 1;
  Dfs(1, 0);
  init_lca();
  for (int i = 1; i <= m; ++i) {
    int x, y, z;
    cin >> x >> y >> z;
    A[get_lca(x, y)].emplace_back(x, y, z);
  }
  dfs(1, 0);
  cout << f[1] << "\n";
  return 0;
}
