#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';
}
