#include <bits/stdc++.h>   using namespace std;   const long long maxn = 1e5 + 10;   int to[maxn << 1], nex[maxn << 1], head[maxn << 1], e, cnt;   int u[maxn << 1], v[maxn << 1];   int dep[maxn << 1], siz[maxn << 1], son[maxn << 1], top[maxn << 1],       fa[maxn << 1], id[maxn << 1];   int sum[maxn << 2];   int n;   void add(int x, int y) {     to[++e] = y;     nex[e] = head[x];     head[x] = e;   }   int ls(int p) { return p << 1; }   int rs(int p) { return p << 1 | 1; }   void push_up(int p) { sum[p] = sum[ls(p)] + sum[rs(p)]; }   int query(int p, int l, int r, int qx, int qy) {     if (qx <= l && qy >= r) {       return sum[p];     }     int res = 0;     int mid = (l + r) >> 1;     if (qx <= mid) res = res + query(ls(p), l, mid, qx, qy);     if (qy > mid) {       res = res + query(rs(p), mid + 1, r, qx, qy);     }     return res;   }   void update(int p, int l, int r, int pos, int val) {     if (l == r) {       sum[p] = val;       return;     }     int mid = (l + r) >> 1;     if (pos <= mid) {       update(ls(p), l, mid, pos, val);     }     if (pos > mid) update(rs(p), mid + 1, r, pos, val);     push_up(p);   }   int getrange(int x, int y) {     int ans = 0;     while (top[x] != top[y]) {       if (dep[top[x]] < dep[top[y]]) swap(x, y);       ans = ans + query(1, 1, n, id[top[x]], id[x]);       x = fa[top[x]];     }     if (dep[x] > dep[y]) swap(x, y);     ans = ans + query(1, 1, n, id[x] + 1, id[y]);     return ans;   }   void dfs1(int x, int f, int deep) {     fa[x] = f;     siz[x] = 1;     dep[x] = deep;     int maxson = -1;     for (int i = head[x]; i; i = nex[i]) {       int y = to[i];       if (y == f) continue;       dfs1(y, x, deep + 1);       siz[x] += siz[y];       if (maxson < siz[y]) {         maxson = siz[y];         son[x] = y;       }     }   }   void dfs2(int x, int topf) {     id[x] = ++cnt;     top[x] = topf;     if (!son[x]) return;     dfs2(son[x], topf);     for (int i = head[x]; i; i = nex[i]) {       int y = to[i];       if (y == fa[x] || y == son[x]) continue;       dfs2(y, y);     }   }   int lca(int x, int y) {     while (top[x] != top[y]) {       if (dep[top[x]] < dep[top[y]]) {         swap(x, y);       }       x = fa[top[x]];     }     if (dep[x] > dep[y]) swap(x, y);     return x;   }   int main() {     memset(sum, 0, sizeof(sum));     scanf( %d , &n);     for (int i = 1; i < n; i++) {       scanf( %d%d , &u[i], &v[i]);       add(u[i], v[i]);       add(v[i], u[i]);     }     dfs1(1, 0, 1);     dfs2(1, 0);     int m;     scanf( %d , &m);     while (m--) {       int op;       scanf( %d , &op);       if (op == 1) {         int x;         scanf( %d , &x);         if (dep[u[x]] > dep[v[x]])           update(1, 1, n, id[u[x]], 0);         else           update(1, 1, n, id[v[x]], 0);       }       if (op == 2) {         int x;         scanf( %d , &x);         if (dep[u[x]] > dep[v[x]]) {           update(1, 1, n, id[u[x]], 1);         } else {           update(1, 1, n, id[v[x]], 1);         }       }       if (op == 3) {         int x, y;         scanf( %d%d , &x, &y);         if (getrange(x, y)) {           printf( -1 n );         } else {           printf( %d n , dep[x] + dep[y] - 2 * dep[lca(x, y)]);         }       }     }   }