#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, P = 1e9 + 7;
int n = 1, w0, q, op[N], u[N], w[N];
vector<int> G[N];
int idx, fa[N], dfn[N], suf[N], d[N];
long long Pow(long long a, int n, long long r = 1) {
  for (; n; n /= 2, a = a * a % P)
    if (n & 1) r = r * a % P;
  return r;
}
void dfs(int u) {
  dfn[u] = ++idx;
  for (int v : G[u]) dfs(v);
  suf[u] = idx;
}
long long c[N * 4], tag[N * 4];
void put(int o, long long v) { (c[o] *= v) %= P, (tag[o] *= v) %= P; }
void pushdown(int o) {
  if (tag[o] ^ 1) put(o * 2, tag[o]), put(o * 2 + 1, tag[o]), tag[o] = 1;
}
void pushup(int o) { c[o] = (c[o * 2] + c[o * 2 + 1]) % P; }
void upd(int L, int R, long long v, int l, int r, int o) {
  if (L <= l && r <= R) return put(o, v);
  pushdown(o);
  if (L <= (l + r) / 2) upd(L, R, v, l, (l + r) / 2, o * 2);
  if (R > (l + r) / 2) upd(L, R, v, (l + r) / 2 + 1, r, o * 2 + 1);
  pushup(o);
}
void add(int p, long long v, int l, int r, int o) {
  if (l == r) return c[o] = v, void();
  pushdown(o);
  if (p <= (l + r) / 2)
    add(p, v, l, (l + r) / 2, o * 2);
  else
    add(p, v, (l + r) / 2 + 1, r, o * 2 + 1);
  pushup(o);
}
int qry(int L, int R, int l, int r, int o) {
  if (L <= l && r <= R) return c[o];
  int res = 0;
  pushdown(o);
  if (L <= (l + r) / 2) res += qry(L, R, l, (l + r) / 2, o * 2);
  if (R > (l + r) / 2) res += qry(L, R, (l + r) / 2 + 1, r, o * 2 + 1);
  return res % P;
}
int qry(int p, int l, int r, int o) {
  if (l == r) return tag[o];
  pushdown(o);
  return p <= (l + r) / 2 ? qry(p, l, (l + r) / 2, o * 2)
                          : qry(p, (l + r) / 2 + 1, r, o * 2 + 1);
}
int main() {
  cin >> w[1] >> q;
  for (int i = (1); i <= (q); i++) {
    scanf("%d%d", &op[i], &u[i]);
    if (op[i] == 1) scanf("%d", &w[++n]), G[fa[n] = u[i]].push_back(n);
  }
  dfs(1);
  int sz = 1;
  for (int i = (1); i <= (n * 4); i++) tag[i] = 1;
  for (int i = (1); i <= (n); i++) d[i] = 1;
  add(1, w[1], 1, n, 1);
  for (int i = (1); i <= (q); i++) {
    int o = u[i];
    if (op[i] == 1) {
      sz++, add(dfn[sz], 1LL * w[sz] * qry(dfn[o], 1, n, 1) % P, 1, n, 1);
      upd(dfn[o], suf[o], (d[o] + 1) * Pow(d[o], P - 2) % P, 1, n, 1), d[o]++;
    } else
      printf("%lld\n",
             qry(dfn[o], suf[o], 1, n, 1) *
                 (o > 1 ? Pow(qry(dfn[fa[o]], 1, n, 1), P - 2) : 1LL) % P);
  }
  return 0;
}
