#include <bits/stdc++.h>
using namespace std;
const int N = 400010;
vector<pair<int, long long> > forc[N];
vector<pair<int, pair<int, long long> > > other[N];
vector<pair<int, pair<int, long long> > > centroid[N];
long long dist[N];
int sub[N];
bool alive[N];
int belongs[N];
vector<pair<int, int> > g[N];
int perm[N], pos[N];
int v_goes_to[N];
vector<int> all;
void dfs(int v, int pr) {
  all.push_back(v);
  sub[v] = 1;
  int sz = g[v].size();
  for (int j = 0; j < sz; j++) {
    int u = g[v][j].first;
    if (!alive[u] || u == pr) {
      continue;
    }
    int len = g[v][j].second;
    dist[u] = dist[v] + len;
    belongs[u] = (belongs[v] == -1 ? u : belongs[v]);
    dfs(u, v);
    sub[v] += sub[u];
  }
}
void build(int v) {
  all.clear();
  dfs(v, -1);
  {
    int old_v = v;
    int total = sub[v];
    int pr = -1;
    while (true) {
      bool found = false;
      int sz = g[v].size();
      for (int j = 0; j < sz; j++) {
        int u = g[v][j].first;
        if (!alive[u] || u == pr) {
          continue;
        }
        if (2 * sub[u] >= total) {
          pr = v;
          v = u;
          found = true;
          break;
        }
      }
      if (!found) {
        break;
      }
    }
    v_goes_to[old_v] = v;
  }
  all.clear();
  dist[v] = 0;
  belongs[v] = -1;
  dfs(v, -1);
  int cnt = all.size();
  for (int i = 0; i < cnt; i++) {
    int u = all[i];
    centroid[u].push_back(make_pair(v, make_pair(belongs[u], dist[u])));
  }
  for (int i = 0; i < cnt; i++) {
    int u = all[i];
    forc[v].push_back(make_pair(pos[u], dist[u]));
  }
  sort(forc[v].begin(), forc[v].end());
  for (int j = 1; j < cnt; j++) {
    forc[v][j].second += forc[v][j - 1].second;
  }
  for (int i = 1; i < cnt; i++) {
    int u = all[i];
    other[v].push_back(make_pair(belongs[u], make_pair(pos[u], dist[u])));
  }
  sort(other[v].begin(), other[v].end());
  for (int j = 1; j < cnt - 1; j++) {
    other[v][j].second.second += other[v][j - 1].second.second;
  }
  vector<int> children;
  for (int i = 0; i < cnt; i++) {
    int u = all[i];
    if (belongs[u] == u) {
      children.push_back(u);
    }
  }
  alive[v] = false;
  for (int i = 0; i < (int)children.size(); i++) {
    build(children[i]);
  }
}
int main() {
  int n, tt;
  scanf("%d %d", &n, &tt);
  for (int i = 0; i < n; i++) {
    scanf("%d", perm + i);
    perm[i]--;
    pos[perm[i]] = i;
  }
  for (int i = 0; i < n - 1; i++) {
    int x, y, z;
    scanf("%d %d %d", &x, &y, &z);
    x--;
    y--;
    g[x].push_back(make_pair(y, z));
    g[y].push_back(make_pair(x, z));
  }
  for (int i = 0; i < n; i++) {
    alive[i] = true;
  }
  build(0);
  int last = 0;
  while (tt--) {
    int com;
    scanf("%d", &com);
    if (com == 1) {
      int from, to, ver;
      scanf("%d %d %d", &from, &to, &ver);
      from ^= last;
      to ^= last;
      ver ^= last;
      from--;
      to--;
      ver--;
      long long ans = 0;
      for (pair<int, pair<int, long long> > p : centroid[ver]) {
        int v = p.first;
        int bel = p.second.first;
        long long d = p.second.second;
        long long sumd = 0;
        int cnt = 0;
        {
          int pf = lower_bound(forc[v].begin(), forc[v].end(),
                               make_pair(from, -1LL)) -
                   forc[v].begin();
          int pt = lower_bound(forc[v].begin(), forc[v].end(),
                               make_pair(to + 1, -1LL)) -
                   forc[v].begin();
          if (pf < pt) {
            sumd += forc[v][pt - 1].second;
            if (pf > 0) {
              sumd -= forc[v][pf - 1].second;
            }
            cnt += pt - pf;
          }
        }
        {
          int pf = lower_bound(other[v].begin(), other[v].end(),
                               make_pair(bel, make_pair(from, -1LL))) -
                   other[v].begin();
          int pt = lower_bound(other[v].begin(), other[v].end(),
                               make_pair(bel, make_pair(to + 1, -1LL))) -
                   other[v].begin();
          if (pf < pt) {
            sumd -= other[v][pt - 1].second.second;
            if (pf > 0) {
              sumd += other[v][pf - 1].second.second;
            }
            cnt -= pt - pf;
          }
        }
        ans += sumd + cnt * d;
      }
      printf("%lld\n", ans);
      last = ans & ((1 << 30) - 1);
    } else {
      int x;
      scanf("%d", &x);
      x ^= last;
      x--;
      int v1 = perm[x];
      int v2 = perm[x + 1];
      int c1 = centroid[v1].size();
      int c2 = centroid[v2].size();
      int i1 = 0;
      int i2 = 0;
      while (i1 < c1 && i2 < c2 &&
             centroid[v1][i1].first == centroid[v2][i2].first) {
        pair<int, pair<int, long long> > p = centroid[v1][i1];
        int v = p.first;
        int bel1 = p.second.first;
        int bel2 = centroid[v2][i2].second.first;
        long long d2 = centroid[v2][i2].second.second;
        {
          int at = lower_bound(forc[v].begin(), forc[v].end(),
                               make_pair(pos[v1], -1LL)) -
                   forc[v].begin();
          forc[v][at].second = (at == 0 ? 0LL : forc[v][at - 1].second) + d2;
        }
        {
          if (bel1 == bel2) {
            int at = lower_bound(other[v].begin(), other[v].end(),
                                 make_pair(bel1, make_pair(pos[v1], -1LL))) -
                     other[v].begin();
            other[v][at].second.second =
                (at == 0 ? 0LL : other[v][at - 1].second.second) + d2;
          } else {
            if (v != v1) {
              int at = lower_bound(other[v].begin(), other[v].end(),
                                   make_pair(bel1, make_pair(pos[v1], -1LL))) -
                       other[v].begin();
              other[v][at].second.first = pos[v2];
            }
            if (v != v2) {
              int at = lower_bound(other[v].begin(), other[v].end(),
                                   make_pair(bel2, make_pair(pos[v2], -1LL))) -
                       other[v].begin();
              other[v][at].second.first = pos[v1];
            }
          }
        }
        i1++;
        i2++;
      }
      for (int rot = 0; rot < 2; rot++) {
        while (i1 < c1) {
          pair<int, pair<int, long long> > p = centroid[v1][i1];
          int v = p.first;
          int bel = p.second.first;
          {
            int at = lower_bound(forc[v].begin(), forc[v].end(),
                                 make_pair(pos[v1], -1LL)) -
                     forc[v].begin();
            forc[v][at].first = pos[v2];
          }
          if (v != v1) {
            int at = lower_bound(other[v].begin(), other[v].end(),
                                 make_pair(bel, make_pair(pos[v1], -1LL))) -
                     other[v].begin();
            other[v][at].second.first = pos[v2];
          }
          i1++;
        }
        swap(v1, v2);
        swap(c1, c2);
        swap(i1, i2);
      }
      swap(perm[x], perm[x + 1]);
      pos[perm[x]] = x;
      pos[perm[x + 1]] = x + 1;
    }
  }
  return 0;
}
