#include <bits/stdc++.h>
using namespace std;
template <class T>
bool umin(T& a, T b) {
  if (a > b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool umax(T& a, T b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
long long a, b, c, type, ric[300007], par[300007], cost[300007], d[300007], n,
    m, lvl[300007], P[300007][20 * 2];
vector<pair<long long, long long> > E[300007];
pair<pair<long long, long long>, long long> way[300007];
long long atabul(long long x) {
  if (ric[x] == x) return x;
  return ric[x] = atabul(ric[x]);
}
void dfs(long long x, long long y, long long z) {
  lvl[x] = lvl[y] + 1;
  P[x][0] = y;
  cost[x] = z;
  if (z == 1) {
    ric[x] = y;
    atabul(x);
  }
  for (int i = 0; i < int(E[x].size()); i++)
    if (E[x][i].first != y) dfs(E[x][i].first, x, E[x][i].second);
}
void build_table() {
  for (int j = 1; j <= 20; j++)
    for (int i = 1; i <= n; i++)
      if (P[i][j - 1] > 0) P[i][j] = P[P[i][j - 1]][j - 1];
}
void form_LCA() {
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= 20; j++) P[i][j] = -1;
  dfs(1, 0, 0);
  build_table();
}
long long LCA(long long x, long long y) {
  if (lvl[x] < lvl[y]) swap(x, y);
  for (int i = 20; i >= 0; i--)
    if (lvl[x] - (1 << i) >= lvl[y]) x = P[x][i];
  if (x == y) return x;
  for (int i = 20; i >= 0; i--)
    if (P[x][i] > 0 && P[x][i] != P[y][i]) x = P[x][i], y = P[y][i];
  return P[x][0];
}
int main() {
  scanf("%lld%lld", &n, &m);
  ric[n] = n;
  for (int i = 1; i < n; i++) {
    scanf("%lld%lld%lld", &a, &b, &c);
    E[a].push_back(make_pair(b, c));
    E[b].push_back(make_pair(a, c));
    ric[i] = i;
    way[i] = {{a, b}, c};
  }
  form_LCA();
  while (m--) {
    scanf("%lld", &type);
    if (type == 1) {
      scanf("%lld%lld%lld", &a, &b, &c);
      long long tr = LCA(a, b);
      while (atabul(a) != atabul(tr) && c > 0) {
        if (cost[a] == 1) {
          a = atabul(a);
          continue;
        }
        c /= cost[a];
        a = P[a][0];
      }
      while (atabul(b) != atabul(tr) && c > 0) {
        if (cost[b] == 1) {
          b = atabul(b);
          continue;
        }
        c /= cost[b];
        b = P[b][0];
      }
      printf("%lld\n", c);
    } else {
      scanf("%lld%lld", &a, &b);
      long long qm = way[a].first.first, gr = way[a].first.second;
      if (lvl[qm] < lvl[gr]) swap(qm, gr);
      cost[qm] = b;
      if (b == 1) {
        ric[qm] = gr;
        atabul(qm);
      }
    }
  }
  return 0;
}
