#include <bits/stdc++.h>   using namespace std;   const int TOUR = 1 << 18, MOD = 1e9 + 7;   int Add(int a, int b) {     a += b;     if (a >= MOD) a -= MOD;     return a;   }   int Sub(int a, int b) {     a -= b;     if (a < 0) a += MOD;     return a;   }   int Mul(int a, int b) { return (int)(((long long)a * b) % MOD); }   int Inverz(int x) {     int ret = 1;     for (int e = MOD - 2; e; e /= 2, x = Mul(x, x))       if (e & 1) ret = Mul(ret, x);     return ret;   }   int Div(int a, int b) { return Mul(a, Inverz(b)); }   struct node {     int sum, mul, prop;   };   struct tour {     node t[2 * TOUR];     tour() {       for (int i = 0; i < 2 * TOUR; i++) {         t[i].sum = 0;         t[i].mul = t[i].prop = 1;       }     }     void propagiraj(int x) {       for (int i = 2 * x; i <= 2 * x + 1; i++) {         t[i].sum = Mul(t[i].sum, t[x].prop);         t[i].mul = Mul(t[i].mul, t[x].prop);         t[i].prop = Mul(t[i].prop, t[x].prop);       }       t[x].prop = 1;     }     void stavi_sum(int pos, int lo, int hi, int ind, int val) {       if (lo >= ind + 1 || hi <= ind) return;       if (lo == ind && hi == ind + 1) {         t[pos].sum = Mul(t[pos].mul, val);         return;       }       propagiraj(pos);       stavi_sum(2 * pos + 0, lo, (lo + hi) / 2, ind, val);       stavi_sum(2 * pos + 1, (lo + hi) / 2, hi, ind, val);       t[pos].sum = Add(t[2 * pos].sum, t[2 * pos + 1].sum);     }     void stavi_sum(int pos, int val) { stavi_sum(1, 0, TOUR, pos, val); }     void stavi_mul(int pos, int lo, int hi, int begin, int end, int val) {       if (lo >= end || hi <= begin) return;       if (lo >= begin && hi <= end) {         t[pos].sum = Mul(t[pos].sum, val);         t[pos].mul = Mul(t[pos].mul, val);         t[pos].prop = Mul(t[pos].prop, val);         return;       }       propagiraj(pos);       stavi_mul(2 * pos + 0, lo, (lo + hi) / 2, begin, end, val);       stavi_mul(2 * pos + 1, (lo + hi) / 2, hi, begin, end, val);       t[pos].sum = Add(t[2 * pos].sum, t[2 * pos + 1].sum);     }     void stavi_mul(int begin, int end, int val) {       stavi_mul(1, 0, TOUR, begin, end, val);     }     int query_sum(int pos, int lo, int hi, int begin, int end) {       if (lo >= end || hi <= begin) return 0;       if (lo >= begin && hi <= end) return t[pos].sum;       propagiraj(pos);       return Add(query_sum(2 * pos + 0, lo, (lo + hi) / 2, begin, end),                  query_sum(2 * pos + 1, (lo + hi) / 2, hi, begin, end));     }     int query_sum(int begin, int end) {       return query_sum(1, 0, TOUR, begin, end);     }     int query_mul(int pos, int lo, int hi, int ind) {       if (lo >= ind + 1 || hi <= ind) return 0;       if (lo == ind && hi == ind + 1) return t[pos].mul;       propagiraj(pos);       return Add(query_mul(2 * pos + 0, lo, (lo + hi) / 2, ind),                  query_mul(2 * pos + 1, (lo + hi) / 2, hi, ind));     }     int query_mul(int ind) { return query_mul(1, 0, TOUR, ind); }   } T;   vector<int> V[TOUR];   pair<int, int> ev[TOUR];   int disc[TOUR], fin[TOUR], vr = 1;   int pocval[TOUR], par[TOUR];   int brdjec[TOUR];   void Dfs(int node) {     disc[node] = vr++;     for (int i = 0; i < (int)V[node].size(); i++) Dfs(V[node][i]);     fin[node] = vr;   }   void Dodaj(int node) {     int p = par[node];     T.stavi_mul(disc[p], fin[p], Mul(Inverz(brdjec[p]), brdjec[p] + 1));     T.stavi_sum(disc[node], pocval[node]);     brdjec[p]++;   }   int Query(int node) {     int ret = T.query_sum(disc[node], fin[node]);     if (node) ret = Div(ret, T.query_mul(disc[par[node]]));     return ret;   }   int main() {     int brq, brcv = 1;     scanf( %d%d , &pocval[0], &brq);     for (int i = 0; i < brq; i++) {       int st;       scanf( %d , &st);       if (st == 2) {         int tmp;         scanf( %d , &tmp);         tmp--;         ev[i] = pair<int, int>(st, tmp);       } else {         scanf( %d%d , &par[brcv], &pocval[brcv]);         par[brcv]--;         V[par[brcv]].push_back(brcv);         ev[i] = pair<int, int>(st, brcv++);       }     }     Dfs(0);     T.stavi_sum(disc[0], pocval[0]);     for (int i = 0; i < brcv; i++) brdjec[i] = 1;     for (int i = 0; i < brq; i++) {       if (ev[i].first == 1)         Dodaj(ev[i].second);       else         printf( %d n , Query(ev[i].second));     }     return 0;   }