You are given a rooted tree on n vertices, its root is the vertex number 1. The i-th vertex contains a number w_i. Split it into the minimum possible number of vertical paths in such a way that each path contains no more than L vertices and the sum of integers w_i on each path does not exceed S. Each vertex should belong to exactly one path.

A vertical path is a sequence of vertices v_1, v_2, …, v_k where v_i (i ≥ 2) is the parent of v_{i - 1}.

Input

The first line contains three integers n, L, S (1 ≤ n ≤ 10^5, 1 ≤ L ≤ 10^5, 1 ≤ S ≤ 10^{18}) — the number of vertices, the maximum number of vertices in one path and the maximum sum in one path.

The second line contains n integers w_1, w_2, …, w_n (1 ≤ w_i ≤ 10^9) — the numbers in the vertices of the tree.

The third line contains n - 1 integers p_2, …, p_n (1 ≤ p_i < i), where p_i is the parent of the i-th vertex in the tree.

Output

Output one number — the minimum number of vertical paths. If it is impossible to split the tree, output -1.

Examples

Input

3 1 3
1 2 3
1 1


Output

3

Input

3 3 6
1 2 3
1 1


Output

2

Input

1 1 10000
10001


Output

-1

Note

In the first sample the tree is split into \{1\},\ \{2\},\ \{3\}.

In the second sample the tree is split into \{1,\ 2\},\ \{3\} or \{1,\ 3\},\ \{2\}.

In the third sample it is impossible to split the tree.
#include <bits/stdc++.h>
using namespace std;
long long int cons;
long long int check(long long int a) {
  if (a >= cons) a %= cons;
  return a;
}
long long int check2(long long int a) {
  a %= cons;
  if (a < 0) a += cons;
  return a;
}
long long int fast_check(long long int a) {
  if (a >= cons) a -= cons;
  return a;
}
long long int GCD(long long int a, long long int b) {
  while (a && b) {
    a = a % b;
    if (a != 0) b = b % a;
  }
  return a + b;
}
long long int exp(long long int a, long long int n) {
  long long int ans = 1;
  a = check(a);
  while (n) {
    if (n & 1) ans = check(ans * a);
    a = check(a * a);
    n = (n >> 1);
  }
  return ans;
}
void print_pair(pair<int, int> p) {
  cout << p.first << " " << p.second << endl;
}
long long int nc2(long long int a) { return (a * (a - 1)) / 2; }
const int N = 1e5 + 10;
vector<int> graph[N];
long long int arr[N];
long long int ans = 0;
long long int len[N];
long long int val[N];
int level[N];
int pa[21][N];
long long int sum[21][N];
long long int n, l, s;
void dfs(int i) {
  for (auto itr : graph[i]) {
    pa[0][itr] = i;
    sum[0][itr] = arr[i];
    level[itr] = 1 + level[i];
    dfs(itr);
  }
}
int ascend(int ind) {
  int temp = 0;
  for (int i = 20; i >= 0; i--) {
    if ((sum[i][ind] + val[ind] <= s) && ((1 << i) + len[ind]) <= l) {
      ind = pa[i][ind];
      temp += (1 << i);
    }
  }
  return temp;
}
void solve(int i) {
  if (graph[i].size() == 0) {
    val[i] = arr[i];
    len[i] = 1;
    return;
  }
  for (auto itr : graph[i]) solve(itr);
  long long int bval = 0;
  long long int bl = 0;
  long long int highest = 0;
  for (auto itr : graph[i]) {
    int temp = ascend(itr);
    if (temp > highest) {
      if (highest > 0) ans++;
      highest = temp;
      bval = val[itr];
      bl = len[itr];
    } else
      ans++;
  }
  val[i] = arr[i] + bval;
  len[i] = 1 + bl;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cons = 1e9 + 7;
  cin >> n >> l >> s;
  for (int i = 1; i <= n; i++) {
    cin >> arr[i];
    if (arr[i] > s) {
      cout << "-1";
      return 0;
    }
  }
  for (int i = 2; i <= n; i++) {
    int first;
    cin >> first;
    graph[first].push_back(i);
  }
  level[1] = 1;
  dfs(1);
  for (int i = 1; i <= 20; i++) {
    for (int j = 1; j <= n; j++) {
      pa[i][j] = pa[i - 1][pa[i - 1][j]];
      sum[i][j] = sum[i - 1][j] + sum[i - 1][pa[i - 1][j]];
    }
  }
  solve(1);
  cout << ans + 1;
  return 0;
}
