#include <bits/stdc++.h>
using namespace std;
struct przedzial {
  int p, k;
};
struct kraw {
  int a, b;
};
int n, m, start = 0;
vector<int> T;
int l, size;
void Stworz(int n) {
  int p = 1;
  while (p < n) p *= 2;
  l = p;
  size = 2 * p - 2;
  for (int i = 0; i <= size; ++i) T.push_back(0);
}
void Dodaj(int a, int b, int x) {
  a += l;
  b += l;
  T[a] += x;
  if (a != b) T[b] += x;
  while (a / 2 != b / 2) {
    if (a % 2 == 0) T[a + 1] += x;
    if (b % 2 == 1) T[b - 1] += x;
    a /= 2;
    b /= 2;
  }
}
int Ile(int a) {
  a += l;
  int s = 0;
  while (a != 0) {
    s += T[a];
    a /= 2;
  }
  return s;
}
void dfs(int akt, vector<vector<int> >& G, vector<int>& ojciec,
         vector<przedzial>& P, vector<int>& nry) {
  for (int i = 0; i < G[akt].size(); ++i) {
    if (G[akt][i] != ojciec[akt]) dfs(G[akt][i], G, ojciec, P, nry);
  }
  if (G[akt].size() == 1 && akt != start) {
    P[akt] = {nry[akt], nry[akt]};
  } else {
    int mini = nry[akt], maxi = nry[akt];
    for (int i = 0; i < G[akt].size(); ++i) {
      if (G[akt][i] != ojciec[akt]) maxi = max(maxi, P[G[akt][i]].k);
    }
    P[akt] = {mini, maxi};
  }
}
int main() {
  scanf("%d", &n);
  vector<vector<int> > G(n);
  vector<kraw> K(n - 1);
  for (int i = 0; i < n - 1; ++i) {
    int a, b;
    scanf("%d %d", &a, &b);
    --a;
    --b;
    G[a].push_back(b);
    G[b].push_back(a);
    K[i] = {a, b};
  }
  for (int i = 0; i < n; ++i)
    if (G[i].size() > G[start].size()) start = i;
  stack<int> S;
  vector<int> nry(n), ojciec(n);
  vector<bool> odw(n, false);
  ojciec[start] = -1;
  int akt, nr = 0;
  S.push(start);
  odw[start] = true;
  while (!S.empty()) {
    akt = S.top();
    S.pop();
    nry[akt] = nr;
    ++nr;
    for (int i = 0; i < G[akt].size(); ++i) {
      if (!odw[G[akt][i]]) {
        odw[G[akt][i]] = true;
        S.push(G[akt][i]);
        ojciec[G[akt][i]] = akt;
      }
    }
  }
  vector<int> odl(n, 0);
  for (int i = 0; i < n; ++i) odw[i] = false;
  queue<int> Q;
  Q.push(start);
  odw[start] = true;
  while (!Q.empty()) {
    akt = Q.front();
    Q.pop();
    for (int i = 0; i < G[akt].size(); ++i) {
      if (!odw[G[akt][i]]) {
        odw[G[akt][i]] = true;
        Q.push(G[akt][i]);
        odl[G[akt][i]] = odl[akt] + 1;
      }
    }
  }
  vector<przedzial> P(n);
  dfs(start, G, ojciec, P, nry);
  Stworz(n);
  for (int i = 0; i < n; ++i) Dodaj(nry[i], nry[i], odl[i]);
  for (int i = 0; i < n - 1; ++i)
    if (ojciec[K[i].a] == K[i].b) swap(K[i].a, K[i].b);
  scanf("%d", &m);
  for (int i = 0; i < m; ++i) {
    int typ;
    scanf("%d", &typ);
    if (typ == 1) {
      int nr;
      scanf("%d", &nr);
      --nr;
      Dodaj(P[K[nr].b].p, P[K[nr].b].k, 1);
    }
    if (typ == 2) {
      int nr;
      scanf("%d", &nr);
      --nr;
      Dodaj(P[K[nr].b].p, P[K[nr].b].k, -1);
    }
    if (typ == 3) {
      int a, b;
      scanf("%d %d", &a, &b);
      --a;
      --b;
      if (nry[b] >= P[a].p && nry[b] <= P[a].k) {
        int dl = odl[b] - odl[a];
        int cz = Ile(nry[b]) - Ile(nry[a]);
        if (dl == cz)
          printf("%d", dl);
        else
          printf("-1");
      } else {
        if (nry[a] >= P[b].p && nry[a] <= P[b].k) {
          int dl = odl[a] - odl[b];
          int cz = Ile(nry[a]) - Ile(nry[b]);
          if (dl == cz)
            printf("%d", dl);
          else
            printf("-1");
        } else {
          int dl = odl[a] + odl[b];
          int cz = Ile(nry[a]) + Ile(nry[b]);
          if (dl == cz)
            printf("%d", dl);
          else
            printf("-1");
        }
      }
      printf("\n");
    }
  }
  return 0;
}
