Allen, having graduated from the MOO Institute of Techcowlogy (MIT), has started a startup! Allen is the president of his startup. He also hires n-1 other employees, each of which is assigned a direct superior. If u is a superior of v and v is a superior of w then also u is a superior of w. Additionally, there are no u and v such that u is the superior of v and v is the superior of u. Allen himself has no superior. Allen is employee number 1, and the others are employee numbers 2 through n.

Finally, Allen must assign salaries to each employee in the company including himself. Due to budget constraints, each employee's salary is an integer between 1 and D. Additionally, no employee can make strictly more than his superior.

Help Allen find the number of ways to assign salaries. As this number may be large, output it modulo 10^9 + 7.

Input

The first line of the input contains two integers n and D (1 ≤ n ≤ 3000, 1 ≤ D ≤ 10^9).

The remaining n-1 lines each contain a single positive integer, where the i-th line contains the integer p_i (1 ≤ p_i ≤ i). p_i denotes the direct superior of employee i+1.

Output

Output a single integer: the number of ways to assign salaries modulo 10^9 + 7.

Examples

Input

3 2
1
1


Output

5


Input

3 3
1
2


Output

10


Input

2 5
1


Output

15

Note

In the first sample case, employee 2 and 3 report directly to Allen. The three salaries, in order, can be (1,1,1), (2,1,1), (2,1,2), (2,2,1) or (2,2,2).

In the second sample case, employee 2 reports to Allen and employee 3 reports to employee 2. In order, the possible salaries are (1,1,1), (2,1,1), (2,2,1), (2,2,2), (3,1,1), (3,2,1), (3,2,2), (3,3,1), (3,3,2), (3,3,3).
#include <bits/stdc++.h>
template <typename T>
inline T max(T a, T b) {
  return a > b ? a : b;
}
template <typename T>
inline T min(T a, T b) {
  return a < b ? a : b;
}
template <typename T>
inline T abs(T a) {
  return a > 0 ? a : -a;
}
template <typename T>
inline bool repr(T &a, T b) {
  return a < b ? a = b, 1 : 0;
}
template <typename T>
inline bool repl(T &a, T b) {
  return a > b ? a = b, 1 : 0;
}
template <typename T>
inline T gcd(T a, T b) {
  T t;
  if (a < b) {
    while (a) {
      t = a;
      a = b % a;
      b = t;
    }
    return b;
  } else {
    while (b) {
      t = b;
      b = a % b;
      a = t;
    }
    return a;
  }
}
template <typename T>
inline T sqr(T x) {
  return x * x;
}
struct Cg {
  inline char operator()() { return getchar(); }
};
struct Cp {
  inline void operator()(char x) { putchar(x); }
};
inline bool IS(char x) { return x == 10 || x == 13 || x == ' '; }
template <typename T>
struct Fr {
  T P;
  inline Fr &operator,(int &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (f) x = -x;
    return *this;
  }
  inline operator int() {
    int x;
    *this, x;
    return x;
  }
  inline Fr &operator,(long long &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (f) x = -x;
    return *this;
  }
  inline operator long long() {
    long long x;
    *this, x;
    return x;
  }
  inline Fr &operator,(char &x) {
    for (x = P(); IS(x); x = P())
      ;
    return *this;
  }
  inline operator char() {
    char x;
    *this, x;
    return x;
  }
  inline Fr &operator,(char *x) {
    char t = P();
    for (; IS(t); t = P())
      ;
    if (~t) {
      for (; !IS(t) && ~t; t = P()) *x++ = t;
    }
    *x++ = 0;
    return *this;
  }
  inline Fr &operator,(double &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (t == '.') {
      double u = 0.1;
      for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1) x += u * (t - '0');
    }
    if (f) x = -x;
    return *this;
  }
  inline operator double() {
    double x;
    *this, x;
    return x;
  }
  inline Fr &operator,(long double &x) {
    x = 0;
    unsigned char t = P();
    while ((t < '0' || t > '9') && t != '-') t = P();
    bool f = 0;
    if (t == '-') t = P(), f = 1;
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    if (t == '.') {
      double u = 0.1;
      for (t = P(); t >= '0' && t <= '9'; t = P(), u *= 0.1) x += u * (t - '0');
    }
    if (f) x = -x;
    return *this;
  }
  inline operator long double() {
    long double x;
    *this, x;
    return x;
  }
  inline Fr &operator,(unsigned int &x) {
    x = 0;
    unsigned char t = P();
    while (t < '0' || t > '9') t = P();
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    return *this;
  }
  inline operator unsigned int() {
    unsigned int x;
    *this, x;
    return x;
  }
  inline Fr &operator,(unsigned long long &x) {
    x = 0;
    unsigned char t = P();
    while (t < '0' || t > '9') t = P();
    x = t - '0';
    for (t = P(); t >= '0' && t <= '9'; t = P()) x = x * 10 + t - '0';
    return *this;
  }
  inline operator unsigned long long() {
    unsigned long long x;
    *this, x;
    return x;
  }
};
Fr<Cg> in;
template <typename T>
struct Fw {
  T P;
  inline Fw &operator,(int x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator()(int x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator,(unsigned int x) {
    if (x) {
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator()(unsigned int x) {
    if (x) {
      unsigned char s[10], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator,(long long x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[19], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator()(long long x) {
    if (x) {
      if (x < 0) P('-'), x = -x;
      unsigned char s[19], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator,(unsigned long long x) {
    if (x) {
      unsigned char s[20], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator()(unsigned long long x) {
    if (x) {
      unsigned char s[20], c = 0;
      while (x) s[c++] = x % 10 + '0', x /= 10;
      while (c--) P(s[c]);
    } else
      P('0');
    return *this;
  }
  inline Fw &operator,(char x) {
    P(x);
    return *this;
  }
  inline Fw &operator()(char x) {
    P(x);
    return *this;
  }
  inline Fw &operator,(const char *x) {
    while (*x) P(*x++);
    return *this;
  }
  inline Fw &operator()(const char *x) {
    while (*x) P(*x++);
    return *this;
  }
  inline Fw &operator()(double x, int y) {
    if (y) {
      double t = 0.5;
      for (int i = y; i--;) t *= 0.1;
      if (x >= 0)
        x += t;
      else
        x -= t, P('-');
      *this, (long long)(abs(x));
      P('.');
      if (x < 0) x = -x;
      while (y--) {
        x *= 10;
        x -= floor(x * 0.1) * 10;
        P(((int)x) % 10 + '0');
      }
    } else if (x >= 0)
      *this, (long long)(x + 0.5);
    else
      *this, (long long)(x - 0.5);
    ;
    return *this;
  }
  inline Fw &operator()(long double x, int y) {
    if (y) {
      double t = 0.5;
      for (int i = y; i--;) t *= 0.1;
      if (x >= 0)
        x += t;
      else
        x -= t, P('-');
      *this, (long long)(abs(x));
      P('.');
      if (x < 0) x = -x;
      while (y--) {
        x *= 10;
        x -= floor(x * 0.1) * 10;
        P(((int)x) % 10 + '0');
      }
    } else if (x >= 0)
      *this, (long long)(x + 0.5);
    else
      *this, (long long)(x - 0.5);
    ;
    return *this;
  }
};
Fw<Cp> out;
namespace bm {
const int N = 23333, P = 1000000007;
const long long Q = 3611686004281801853;
inline int pow(int a, int b) {
  int r = 1;
  for (; b; b >>= 1, a = (long long)a * a % P)
    if (b & 1) r = (long long)r * a % P;
  return r;
}
int m, a[N], b[N], d[N], f[2][N];
long long c[N * 2];
inline void pre() {
  int x = (P - pow(a[m - 1], P - 2)) % P;
  for (int i = 0, iend = m - 1; i < iend; i++)
    d[i + 1] = (long long)x * a[i] % P;
  d[0] = P - x;
}
inline void pl() {
  c[m - 1] = 0;
  for (int i = 0, iend = m - 1; i < iend; i++) c[i] = b[i + 1];
  for (int i = (m)-1; ~i; i--) b[i] = ((long long)b[0] * a[i] + c[i]) % P;
}
inline void ml() {
  for (int i = 0, iend = m * 2 - 1; i < iend; i++) c[i] = 0;
  for (int i = 0, iend = m; i < iend; i++)
    for (int j = 0, jend = m; j < jend; j++) {
      c[i + j] += (long long)b[i] * b[j];
      if (c[i + j] >= Q) c[i + j] -= Q;
    }
  for (int i = m * 2 - 1, iend = m; i >= iend; i--) {
    int t = c[i] % P;
    for (int j = 0, jend = m; j < jend; j++) {
      c[i - m + j] += (long long)d[j] * t;
      if (c[i - m + j] >= Q) c[i - m + j] -= Q;
    }
  }
  for (int i = 0, iend = m; i < iend; i++) b[i] = c[i] % P;
}
inline void init(int *p, int _m) {
  m = _m;
  for (int i = 0, iend = m; i < iend; i++) a[i] = p[i];
  pre();
}
inline int solve(int *s, int n) {
  if (n < m) return s[n];
  n -= m - 1;
  for (int i = 0, iend = m; i < iend; i++) b[i] = a[i];
  int t = 0;
  for (; n >> t; t++)
    ;
  for (t -= 2; ~t; t--) {
    ml();
    if (n >> t & 1) pl();
  }
  int ans = 0;
  for (int i = 0, iend = m; i < iend; i++)
    ans = ((long long)b[i] * s[m - i - 1] + ans) % P;
  return ans;
}
inline std::pair<int *, int> _get(int n, int *s) {
  int m = 0, l = 1, e = 1;
  bool u = 0;
  for (int i = 0, iend = n; i < iend; i++) {
    int d = 0;
    for (int j = 0, jend = m; j < jend; j++)
      d = (d + (long long)f[u][j] * s[i - j - 1]) % P;
    d = (s[i] + P - d) % P;
    if (!d) {
      l++;
      continue;
    }
    int q = (long long)d * pow(e, P - 2) % P, qr = P - q;
    if (m * 2 > i) {
      for (int j = m - 1, jend = l; j >= jend; j--)
        f[u][j] = (f[u][j] + (long long)qr * f[u ^ 1][j - l]) % P;
      f[u][l - 1] = (f[u][l - 1] + q) % P;
      l++;
    } else {
      m = i - m + 1;
      for (int j = m - 1, jend = l; j >= jend; j--)
        f[u ^ 1][j] = (f[u][j] + (long long)qr * f[u ^ 1][j - l]) % P;
      f[u ^ 1][l - 1] = (f[u][l - 1] + q) % P;
      for (int j = 0, jend = l - 1; j < jend; j++) f[u ^ 1][j] = f[u][j];
      u ^= 1, l = 1, e = d;
    }
  }
  return std::make_pair(f[u], m);
}
inline int get(int n, int *s, int *r) {
  std::pair<int *, int> t = _get(n, s);
  for (int i = 0, iend = t.second; i < iend; i++) r[i] = t.first[i];
  return t.second;
}
inline int all(int *s, int m, int n) {
  std::pair<int *, int> t = _get(m, s);
  init(t.first, t.second);
  return solve(s, n);
}
}  // namespace bm
const int N = 3007, P = 1000000007;
std::vector<int> p[N];
int n, m, K, fa[N], f[N][N * 3];
inline void dfs(int x) {
  for (int i = 1, iend = m; i <= iend; i++) f[x][i] = 1;
  for (__typeof((p[x]).end()) i = (p[x]).begin(); i != (p[x]).end(); ++i) {
    dfs(*i);
    for (int j = 1, jend = m; j <= jend; j++)
      f[x][j] = (long long)f[x][j] * f[*i][j] % P;
  }
  for (int i = 1, iend = m; i <= iend; i++) (f[x][i] += f[x][i - 1]) %= P;
}
int main() {
  in, n, K;
  m = n * 2 + 233;
  for (int i = 2, iend = n; i <= iend; i++) {
    in, fa[i];
    p[fa[i]].push_back(i);
  }
  dfs(1);
  out, bm::all(f[1] + 1, m, K - 1), '\n';
}
