#include <bits/stdc++.h>   using namespace std;   const long long maxN = 2e5 + 7;   const long long segN = 8e5 + 7;   const long long moD = 1e9 + 7;   struct query {     long long t, x, y;   };   long long n;   long long st[maxN], fi[maxN], sum[segN], deg[maxN], mul[segN], laz[segN],       val[maxN];   vector<long long> chi[maxN];   vector<query> que;   long long wop(long long x, long long y) {     if (y == 0) return 1;     long long res = wop(x, y / 2);     return res * res % moD * (y % 2 == 1 ? x : 1) % moD;   }   long long dfs(long long v) {     fi[v] = st[v] + 1;     for (long long u : chi[v]) {       st[u] = fi[v];       fi[v] = dfs(u);     }     return fi[v];   }   void merge(long long x) { sum[x] = (sum[x << 1] + sum[x << 1 | 1]) % moD; }   void upd(long long x, long long val) {     sum[x] = sum[x] * val % moD;     mul[x] = mul[x] * val % moD;     laz[x] = laz[x] * val % moD;   }   void shift(long long x) {     upd(x << 1, laz[x]);     upd(x << 1 | 1, laz[x]);     laz[x] = 1;   }   void add(long long idx, long long val, long long x = 1, long long xl = 0,            long long xr = n) {     if (xr - xl == 1) {       sum[x] = (sum[x] + val) % moD;       return;     }     long long xm = (xl + xr) >> 1;     shift(x);     if (idx < xm)       add(idx, val, x << 1, xl, xm);     else       add(idx, val, x << 1 | 1, xm, xr);     merge(x);   }   void mult(long long ql, long long qr, long long qv, long long x = 1,             long long xl = 0, long long xr = n) {     if (xl >= qr || xr <= ql) return;     if (ql <= xl && qr >= xr) {       sum[x] = sum[x] * qv % moD;       laz[x] = laz[x] * qv % moD;       mul[x] = mul[x] * qv % moD;       return;     }     shift(x);     long long xm = (xl + xr) >> 1;     mult(ql, qr, qv, x << 1, xl, xm);     mult(ql, qr, qv, x << 1 | 1, xm, xr);     merge(x);   }   long long get_mul(long long idx, long long x = 1, long long xl = 0,                     long long xr = n) {     if (xr - xl == 1) return mul[x];     long long xm = (xl + xr) >> 1;     shift(x);     if (idx < xm) return get_mul(idx, x << 1, xl, xm);     return get_mul(idx, x << 1 | 1, xm, xr);   }   long long get_sum(long long ql, long long qr, long long x = 1, long long xl = 0,                     long long xr = n) {     if (xl >= qr || xr <= ql) return 0;     if (ql <= xl && qr >= xr) return sum[x];     long long xm = (xl + xr) >> 1;     shift(x);     long long res = 0;     res += get_sum(ql, qr, x << 1, xl, xm);     res += get_sum(ql, qr, x << 1 | 1, xm, xr);     return res % moD;   }   long long inv(long long x) { return wop(x, moD - 2); }   int32_t main() {     ios::sync_with_stdio(0);     cin.tie(0);     long long q;     cin >> val[0] >> q;     que.resize(q);     for (long long i = 0; i < q; ++i) {       cin >> que[i].t >> que[i].x;       que[i].x--;       if (que[i].t == 1) {         n++;         cin >> que[i].y;         chi[que[i].x].push_back(n);         val[n] = que[i].y;       }     }     n++;     for (long long i = 0; i < segN; ++i) laz[i] = mul[i] = 1;     dfs(0);     mul[0] = deg[0] = 1;     add(st[0], val[0]);     long long c = 0;     for (long long i = 0; i < q; ++i) {       long long v = que[i].x;       if (que[i].t == 1) {         c++;         deg[c] = 1;         mult(st[v], fi[v], inv(deg[v]) * (deg[v] + 1) % moD);         deg[v]++;         add(st[c], val[c] * get_mul(st[c]) % moD);       } else         cout << get_sum(st[v], fi[v]) * inv(get_mul(st[v])) % moD * deg[v] % moD              <<   n ;     }   }