#include <bits/stdc++.h>
using namespace std;
const int N = 500005;
int ans[N], size[N], f[N], n, m, k, x[N], y[N], cnt, opt[N], first[N];
struct Tree {
  vector<pair<int, int> > v, g;
  int l, r;
} T[N * 4];
inline void build(int x, int l, int r) {
  T[x].l = l;
  T[x].r = r;
  if (l == r) return;
  int mid = (l + r) / 2;
  build(x * 2, l, mid);
  build(x * 2 + 1, mid + 1, r);
}
inline int find(int x) {
  while (x != f[x]) x = f[x];
  return x;
}
inline void insert(int x, int l, int r, int z1, int z2) {
  if (T[x].l > r || l > T[x].r) return;
  if (T[x].l >= l && T[x].r <= r) {
    T[x].v.push_back(make_pair(z1, z2));
    return;
  }
  insert(x * 2, l, r, z1, z2);
  insert(x * 2 + 1, l, r, z1, z2);
}
inline void insert2(int x, int y, int z1, int z2) {
  if (T[x].l == T[x].r) {
    T[x].g.push_back(make_pair(z1, z2));
    return;
  }
  int mid = (T[x].l + T[x].r) / 2;
  if (y <= mid)
    insert2(x * 2, y, z1, z2);
  else
    insert2(x * 2 + 1, y, z1, z2);
}
inline void solve(int x) {
  vector<pair<int, int> > v;
  for (pair<int, int> i : T[x].v) {
    int fx = find(i.first), fy = find(i.second);
    if (fx == fy) continue;
    if (size[fx] > size[fy]) swap(fx, fy);
    f[fx] = fy;
    size[fy] += size[fx];
    v.push_back(make_pair(fx, fy));
  }
  reverse(v.begin(), v.end());
  for (pair<int, int> i : T[x].g) ans[i.second] = size[find(i.first)];
  if (T[x].l != T[x].r) solve(x * 2), solve(x * 2 + 1);
  for (pair<int, int> i : v) {
    size[i.second] -= size[i.first];
    f[i.first] = i.first;
  }
}
int main() {
  scanf("%d%d%d", &n, &m, &k);
  for (int i = 1; i <= n; i++) size[i] = 1, f[i] = i;
  cnt = 1;
  for (int i = 1; i <= m; i++) {
    scanf("%d", &opt[i]);
    if (opt[i] == 1)
      scanf("%d%d", &x[i], &y[i]);
    else if (opt[i] == 2)
      scanf("%d", &x[i]);
    else
      cnt++, first[cnt] = i;
  }
  build(1, 1, m);
  int now = 1, Ask = 0;
  first[cnt + 1] = m + 1;
  for (int i = 1; i <= m; i++) {
    if (opt[i] == 1)
      insert(1, i, first[min(cnt + 1, now + k)] - 1, x[i], y[i]);
    else if (opt[i] == 2)
      insert2(1, i, x[i], ++Ask);
    else
      now++;
  }
  solve(1);
  for (int i = 1; i <= Ask; i++) printf("%d\n", ans[i]);
}
