#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int oo = 2e9;
const int N = 1e5+5;
const int LG = 18;

struct Query {
    int type, u, v;
} qs[N];

int n, q;
vector<pair<int, int>> adj[N];
int destroyed[N], ans[N];

bool active[N];
int P[N];
int depth[N], up[N][LG], min_w[N][LG];

int find(int u) {
    return P[u] == u ? u : P[u] = find(P[u]);
}

void join(int u, int v) {
    u = find(u); v = find(v);
    if (u != v) P[v] = u;
}

void dfs(int u, int p, int w) {
    up[u][0] = p;
    min_w[u][0] = w;
    for (int i = 1; i < LG; i++) {
        up[u][i] = up[up[u][i - 1]][i - 1];
        min_w[u][i] = min(min_w[u][i - 1], min_w[up[u][i - 1]][i - 1]);
    }
    for (auto [v, c] : adj[u]) {
        if (v == p) continue;
        depth[v] = depth[u] + 1;
        dfs(v, u, c);
    }
}

int get_ans(int u, int v) {
    if (depth[u] < depth[v]) swap(u, v);
    int ans = oo;
    for (int i = LG - 1; i >= 0; i--)
        if (depth[u] - (1 << i) >= depth[v]) {
            ans = min(ans, min_w[u][i]);
            u = up[u][i];
        }
    if (u == v) return ans;
    for (int i = LG - 1; i >= 0; i--)
        if (up[u][i] != up[v][i]) {
            ans = min({ans, min_w[u][i], min_w[v][i]});
            u = up[u][i];
            v = up[v][i];
        }
    return min({ans, min_w[u][0], min_w[v][0]});;
}

void solve() {
    cin >> n >> q;
    for (int i = 0; i < n - 1; i++) {
        int u, v, w; cin >> u >> v >> w;
        adj[u].emplace_back(v, w);
        adj[v].emplace_back(u, w);
    }
    for (int i = 0; i < LG; i++) min_w[0][i] = oo;
    dfs(1, 0, oo);
    for (int i = 1; i <= q; i++) {
        cin >> qs[i].type;
        if (qs[i].type == 1) cin >> qs[i].u >> qs[i].v;
        else {
            cin >> qs[i].u;
            destroyed[qs[i].u]++;
        }
    }
    for (int i = 1; i <= n; i++) {
        P[i] = i;
        if (!destroyed[i]) active[i] = 1;
    }
    for (int u = 1; u <= n; u++) {
        if (!active[u]) continue;
        for (auto [v, c] : adj[u])
            if (active[v]) join(u, v);
    }
    for (int i = q; i >= 1; i--) {
        if (qs[i].type == 1) {
            int u = qs[i].u, v = qs[i].v;
            if (u == v) ans[i] = 0;
            else if (find(u) == find(v)) ans[i] = get_ans(u, v);
            else ans[i] = -1;
        } else {
            int u = qs[i].u;
            destroyed[u]--;
            if (!destroyed[u]) {
                active[u] = 1;
                for (auto [v, c] : adj[u])
                    if (active[v]) join(u, v);
            }
        }
    }
    for (int i = 1; i <= q; i++)
        if (qs[i].type == 1) cout << ans[i] << '\n';
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    #define TASK "BACKUP"
    if (fopen(TASK".INP", "r")) {
        freopen(TASK".INP", "r", stdin);
        freopen(TASK".OUT", "w", stdout);
    }
    
    int tests = 1; // cin >> tests;
    while (tests--) solve();

    #ifdef LOCAL
    cerr << "\nTime elapsed: " << clock() << " ms.\n";
    #endif
    return 0;
};
