#include <bits/stdc++.h>
using namespace std;
const int P = 1e9 + 7;
vector<int> b[200005];
int L[200005], R[200005], u[200005], v[200005], opt[200005], size[200005];
int m, n, ql, qr, upd, tot, now, ans, i, x;
struct data {
  int cnt, sum;
  data() { cnt = 1; }
  void multi(int x) {
    cnt = 1ll * cnt * x % P;
    sum = 1ll * sum * x % P;
  }
  int renew(int x) {
    cnt = 1;
    sum = x;
    return 0;
  }
} a[200005 << 2];
void DFS(int x, int Fa) {
  L[x] = ++tot;
  for (int i = 0, y; i < b[x].size(); i++)
    if ((y = b[x][i]) != Fa) DFS(y, x);
  R[x] = tot;
}
int INV(int a) {
  int ret = 1, b = P - 2;
  for (; b; b >>= 1, a = 1ll * a * a % P)
    if (b & 1) ret = 1ll * ret * a % P;
  return ret;
}
inline void down(int x) {
  if (a[x].cnt == 1) return;
  a[x << 1].multi(a[x].cnt);
  a[x << 1 | 1].multi(a[x].cnt);
  a[x].cnt = 1;
}
inline void up(int x) { a[x].sum = (a[x << 1].sum + a[x << 1 | 1].sum) % P; }
void Multi(int x, int l, int r) {
  if (ql <= l && r <= qr) {
    a[x].multi(now);
    return;
  }
  int mid = (l + r) >> 1;
  down(x);
  if (ql <= mid) Multi(x << 1, l, mid);
  if (qr > mid) Multi(x << 1 | 1, mid + 1, r);
  up(x);
}
int Update(int x, int l, int r, int pos) {
  if (l == r) return (!upd) ? a[x].sum : a[x].renew(now);
  int mid = (l + r) >> 1;
  down(x);
  int ret = (pos <= mid) ? Update(x << 1, l, mid, pos)
                         : Update(x << 1 | 1, mid + 1, r, pos);
  return up(x), ret;
}
void Query(int x, int l, int r) {
  if (ql <= l && r <= qr) {
    ans = (ans + a[x].sum) % P;
    return;
  }
  int mid = (l + r) >> 1;
  down(x);
  if (ql <= mid) Query(x << 1, l, mid);
  if (qr > mid) Query(x << 1 | 1, mid + 1, r);
}
int main() {
  scanf("%d%d", &v[1], &m);
  n = 1;
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &opt[i], &u[i]);
    if (opt[i] == 1) scanf("%d", &v[++n]), b[u[i]].push_back(n);
  }
  DFS(1, 0);
  size[n = 1] = 1;
  upd = 1;
  now = v[1];
  Update(1, 1, tot, L[1]);
  for (i = 1; i <= m; i++)
    if (opt[i] == 1) {
      x = u[i];
      size[++n] = 1;
      ql = L[x];
      qr = R[x];
      now = 1ll * (size[x] + 1) * INV(size[x]) % P;
      ++size[x];
      Multi(1, 1, tot);
      upd = 0;
      now = Update(1, 1, tot, L[x]);
      now = 1ll * now * INV(v[x]) % P;
      now = 1ll * now * v[n] % P;
      upd = 1;
      Update(1, 1, tot, L[n]);
    } else {
      x = u[i];
      ans = 0;
      ql = L[x];
      qr = R[x];
      Query(1, 1, tot);
      upd = 0;
      now = Update(1, 1, tot, L[x]);
      now = 1ll * now * INV(1ll * v[x] * size[x] % P) % P;
      ans = 1ll * ans * INV(now) % P;
      printf("%d\n", ans);
    }
}
