#include <bits/stdc++.h>
using namespace std;
int parent[300005], maxLen[300005];
int findRoot(int u) {
  int root = u;
  while (parent[root] != root) {
    root = parent[root];
  }
  while (parent[u] != root) {
    int y = parent[u];
    parent[u] = root;
    u = y;
  }
  return root;
}
void unionNum(int u, int v) {
  int ru = findRoot(u), rv = findRoot(v);
  if (ru == rv) return;
  if (maxLen[ru] > maxLen[rv]) {
    parent[rv] = ru;
    maxLen[ru] = max(maxLen[ru], maxLen[ru] / 2 + maxLen[rv] / 2 +
                                     maxLen[ru] % 2 + maxLen[rv] % 2 + 1);
  } else {
    swap(ru, rv);
    parent[rv] = ru;
    maxLen[ru] = max(maxLen[ru], maxLen[ru] / 2 + maxLen[rv] / 2 +
                                     maxLen[ru] % 2 + maxLen[rv] % 2 + 1);
  }
}
int visited[300005] = {0};
bool nVis(int &i, int n) {
  while (i <= n && visited[i] == 1) i++;
  if (i <= n) return true;
  return false;
}
void dfs(int node, vector<int> child[]) {
  map<int, int> v1, v2, d1, d2;
  stack<int> myStack;
  myStack.push(node);
  v1[node] = 1;
  d1[node] = 0;
  visited[node] = 1;
  while (!myStack.empty()) {
    int y = myStack.top();
    myStack.pop();
    for (size_t i = 0; i < child[y].size(); i++) {
      if (v1[child[y][i]] == 0) {
        v1[child[y][i]] = 1;
        d1[child[y][i]] = d1[y] + 1;
        myStack.push(child[y][i]);
        visited[child[y][i]] = 1;
      }
    }
  }
  for (map<int, int>::iterator it = d1.begin(); it != d1.end(); it++) {
    if (d1[node] < it->second) {
      node = it->first;
    }
  }
  myStack.push(node);
  d2[node] = 0;
  v2[node] = 1;
  while (!myStack.empty()) {
    int y = myStack.top();
    myStack.pop();
    parent[y] = node;
    for (size_t i = 0; i < child[y].size(); i++) {
      if (v2[child[y][i]] == 0) {
        v2[child[y][i]] = 1;
        d2[child[y][i]] = d2[y] + 1;
        maxLen[node] = max(maxLen[node], d2[child[y][i]]);
        myStack.push(child[y][i]);
      }
    }
  }
}
int main() {
  int n, m, q, a, b;
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i <= n; i++) {
    parent[i] = i;
    maxLen[i] = 0;
  }
  vector<int> child[n + 1];
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &a, &b);
    child[a].push_back(b);
    child[b].push_back(a);
  }
  int i = 1;
  while (nVis(i, n)) {
    dfs(i, child);
  }
  while (q--) {
    int type;
    scanf("%d", &type);
    if (type == 1) {
      scanf("%d", &a);
      printf("%d\n", maxLen[findRoot(a)]);
    } else {
      scanf("%d%d", &a, &b);
      unionNum(a, b);
    }
  }
}
