#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
int n, m, lvl[200009], sub[200009], P[200009][19], no = 1, ata[200009];
int pos[200009], chain[200009], TIM, dp[200009], sum[200009], F[200009];
vector<int> adj[200009];
vector<pair<pair<int, int>, int> > query[200009];
void dfs(int nd, int pr) {
  sub[nd] = 1;
  lvl[nd] = (~pr ? lvl[pr] + 1 : 1);
  P[nd][0] = pr;
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++)
    dfs(*it, nd), sub[nd] += sub[*it];
}
void HLD(int nd) {
  if (ata[no] == -1) ata[no] = nd;
  pos[nd] = ++TIM;
  chain[nd] = no;
  int mx = 0, who;
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++)
    if (umax(mx, sub[*it])) who = *it;
  if (mx) HLD(who);
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++)
    if (*it != who) no++, HLD(*it);
}
int LCA(int x, int y) {
  if (lvl[x] < lvl[y]) swap(x, y);
  for (int i = 17; i >= 0; i--)
    if (~P[x][i] and lvl[x] - (1 << i) >= lvl[y]) x = P[x][i];
  if (x == y) return x;
  for (int i = 17; i >= 0; i--)
    if (~P[x][i] and P[x][i] != P[y][i]) x = P[x][i], y = P[y][i];
  return P[x][0];
}
void build() {
  for (int j = 1; j <= 17; j++)
    for (int i = 1; i <= n; i++)
      if (~P[i][j - 1]) P[i][j] = P[P[i][j - 1]][j - 1];
}
void upd(int x, int val) {
  for (; x < 200009; x += x & (-x)) F[x] += val;
}
int get(int x) {
  int res = 0;
  for (; x; x -= x & (-x)) res += F[x];
  return res;
}
int tap(int x, int y) { return get(y) - get(x - 1); }
int atla(int x, int y) {
  int ans = 0;
  while (1) {
    if (chain[x] == chain[y]) return ans + tap(pos[y] + 1, pos[x]);
    ans += tap(pos[ata[chain[x]]], pos[x]);
    x = P[ata[chain[x]]][0];
  }
}
int dfs1(int nd) {
  for (__typeof((adj[nd]).begin()) it = (adj[nd]).begin();
       it != (adj[nd]).end(); it++)
    sum[nd] += dfs1(*it);
  dp[nd] = sum[nd];
  for (__typeof((query[nd]).begin()) it = (query[nd]).begin();
       it != (query[nd]).end(); it++)
    umax(dp[nd], atla(it->first.first, nd) + atla(it->first.second, nd) +
                     sum[nd] + it->second);
  upd(pos[nd], sum[nd] - dp[nd]);
  return dp[nd];
}
int main() {
  memset(ata, -1, sizeof ata);
  memset(P, -1, sizeof P);
  scanf("%d%d", &n, &m);
  for (int i = 2; i <= n; i++) {
    int p;
    scanf("%d", &p);
    adj[p].push_back(i);
  }
  dfs(1, -1);
  build();
  HLD(1);
  while (m--) {
    int u, v, c;
    scanf("%d%d%d", &u, &v, &c);
    query[LCA(u, v)].push_back(make_pair(make_pair(u, v), c));
  }
  printf("%d\n", dfs1(1));
  return 0;
}
