#include <bits/stdc++.h>
using namespace std;
const int MaxInt = 300010;
bool arrUsados[MaxInt];
vector<int> mapa[MaxInt];
int caminos[MaxInt], tam[MaxInt], diametro[MaxInt];
int aux, aux2;
int find(int i);
void agregarCamino(int x, int y);
void juntarCiudad(int x, int y);
void depthFirst(int i, int depth, int k);
int main() {
  int n, m, q, qT, x = 0, y, aux3;
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 0; i <= n; i++) {
    caminos[i] = i;
    tam[i] = i;
    diametro[i] = 0;
  }
  for (int i = 0; i < m; i++) {
    scanf("%d %d", &x, &y);
    mapa[x].push_back(y);
    mapa[y].push_back(x);
    agregarCamino(x, y);
  }
  for (int i = 0; i <= n; i++) {
    aux3 = find(i);
    if (!arrUsados[aux3]) {
      arrUsados[aux3] = 1;
      aux = -1;
      depthFirst(i, 0, -1);
      aux = -1;
      depthFirst(aux2, 0, -1);
      diametro[aux3] = aux;
    }
  }
  while (q--) {
    scanf("%d %d", &qT, &x);
    if (qT == 2) {
      scanf("%d", &y);
      juntarCiudad(x, y);
    } else {
      printf("%d\n", diametro[find(x)]);
    }
  }
  return 0;
}
int find(int i) {
  if (caminos[i] == i) return i;
  caminos[i] = find(caminos[i]);
  return caminos[i];
}
void agregarCamino(int ciudad, int ciudad2) {
  ciudad = find(ciudad);
  ciudad2 = find(ciudad2);
  if (tam[ciudad] > tam[ciudad2]) swap(ciudad, ciudad2);
  tam[ciudad2] += tam[ciudad];
  caminos[ciudad] = ciudad2;
}
void juntarCiudad(int ciudad, int ciudad2) {
  ciudad = find(ciudad);
  ciudad2 = find(ciudad2);
  if (ciudad != ciudad2) {
    if (tam[ciudad] > tam[ciudad2]) swap(ciudad, ciudad2);
    tam[ciudad2] += tam[ciudad];
    caminos[ciudad] = ciudad2;
    diametro[ciudad2] =
        max(((diametro[ciudad] + 1) / 2 + (diametro[ciudad2] + 1) / 2 + 1),
            max(diametro[ciudad], diametro[ciudad2]));
  }
}
void depthFirst(int i, int depth, int k) {
  if (depth > aux) {
    aux = depth;
    aux2 = i;
  }
  for (int j = 0; j < mapa[i].size(); j++) {
    int to = mapa[i][j];
    if (to != k) depthFirst(to, depth + 1, i);
  }
}
