#include <bits/stdc++.h>
using namespace std;
vector<int> op[300004];
int par[300004];
int maxe[300004];
int sz[300004];
int visit[300004];
int findd(int u) {
  if (u == par[u]) return u;
  return par[u] = findd(par[u]);
}
int ans = 0;
int max_c = 0;
int dfs(int node) {
  visit[node] = 1;
  vector<int> ss;
  int i;
  for (i = 0; i < op[node].size(); i++) {
    if (!visit[op[node][i]]) {
      int s = 1 + dfs(op[node][i]);
      ss.push_back(s);
    }
  }
  int p = 0;
  if (ss.size() > 1) {
    sort(ss.begin(), ss.end());
    ans = max(ans, ss[ss.size() - 1] + ss[ss.size() - 2]);
    p = ss[ss.size() - 1];
  }
  if (ss.size() == 1) p = ss[0];
  ans = max(ans, p);
  return p;
}
int main() {
  int n, m, q;
  scanf("%d%d%d", &n, &m, &q);
  int i;
  for (i = 1; i <= n; i++) par[i] = i, sz[i] = 1;
  for (i = 0; i < m; i++) {
    int x, y;
    scanf("%d%d", &x, &y);
    op[x].push_back(y);
    op[y].push_back(x);
    int a = findd(x);
    int b = findd(y);
    if (a != b) {
      par[b] = a;
      sz[a] += sz[b];
    }
  }
  for (i = 1; i <= n; i++) {
    if (!visit[i]) {
      ans = 0;
      dfs(i);
      int c = findd(i);
      maxe[c] = ans;
    }
  }
  for (i = 0; i < q; i++) {
    int t, x, y;
    scanf("%d", &t);
    if (t == 2) {
      scanf("%d%d", &x, &y);
      int a = findd(x);
      int b = findd(y);
      if (maxe[a] > maxe[b]) swap(a, b);
      if (a == b) continue;
      int test2all;
      int re = (maxe[b] / 2) + (maxe[b] % 2) + (maxe[a] / 2) +
               ((maxe[a] % 2) != 0) + 1;
      test2all = re;
      maxe[a] = max(maxe[a], max(maxe[b], test2all));
      par[b] = a;
      sz[a] += sz[b];
    } else {
      scanf("%d", &x);
      int c = findd(x);
      printf("%d\n", maxe[c]);
    }
  }
  return 0;
}
