#include <bits/stdc++.h>
using namespace std;
int treeNo[111111];
vector<vector<int> > BIT;
vector<pair<int, int> > E[111111];
int in[111111];
int base[111111];
int P[111111], depth[111111];
void update(int x, int val, int id) {
  for (; x < BIT[id].size(); x += (x & -x)) BIT[id][x] += val;
}
int read(int x, int id) {
  int sum = 0;
  for (; x; x -= (x & -x)) sum += BIT[id][x];
  return sum;
}
void dfs(int first, int par, int d, int id) {
  P[first] = par;
  depth[first] = d;
  BIT[id].push_back(0);
  treeNo[first] = id;
  for (int i = 0; i < E[first].size(); i++) {
    int u = E[first][i].first;
    if (u == par) continue;
    dfs(u, first, d + 1, id);
    base[E[first][i].second] = u;
  }
}
int main() {
  int N;
  cin >> N;
  int u, first;
  for (int i = 1; i < N; i++) {
    cin >> u >> first;
    E[u].push_back({first, i});
    E[first].push_back({u, i});
    in[u]++;
    in[first]++;
  }
  int root = 0;
  for (int i = 1; i <= N; i++)
    if (in[i] > 2) root = i;
  if (root == 0)
    for (int i = 1; i <= N; i++)
      if (in[i] == 1) root = i;
  BIT.resize(E[root].size());
  for (int i = 0; i < E[root].size(); i++) {
    BIT[i].push_back(0);
    dfs(E[root][i].first, root, 1, i);
    base[E[root][i].second] = E[root][i].first;
  }
  int Q, t;
  cin >> Q;
  while (Q--) {
    scanf("%d %d", &t, &first);
    if (t == 3) {
      scanf("%d", &u);
      if (u == root or first == root) {
        if (u == root) swap(u, first);
        int sum = read(depth[u], treeNo[u]);
        if (sum == 0)
          printf("%d\n", depth[u]);
        else
          printf("-1\n");
      } else if (treeNo[u] == treeNo[first]) {
        if (depth[u] == depth[first])
          printf("0\n");
        else {
          if (depth[first] < depth[u]) swap(u, first);
          int sum =
              read(depth[first], treeNo[first]) - read(depth[u], treeNo[first]);
          if (sum == 0)
            printf("%d\n", depth[first] - depth[u]);
          else
            printf("-1\n");
        }
      } else {
        int sum = read(depth[u], treeNo[u]) + read(depth[first], treeNo[first]);
        if (sum == 0)
          printf("%d\n", depth[first] + depth[u]);
        else
          printf("-1\n");
      }
    } else if (t == 2) {
      int b = base[first];
      update(depth[b], 1, treeNo[b]);
    } else if (t == 1) {
      int b = base[first];
      update(depth[b], -1, treeNo[b]);
    }
  }
}
