#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
int n, q, k;
vector<pair<int, int> > tree[N << 2];
int ask[N], ans[N];
struct que {
  int x, y, times, l;
};
queue<que> Q;
int fa[N], h[N], siz[N];
int find(int o) {
  if (o != fa[o]) {
    return find(fa[o]);
  }
  return o;
}
struct gu {
  int first, second, val;
};
gu merge(int x, int y) {
  x = find(x);
  y = find(y);
  gu re;
  re.val = -1;
  if (x == y) return re;
  if (h[x] > h[y]) swap(x, y);
  fa[x] = y;
  siz[y] += siz[x];
  re.val = h[x] == h[y];
  h[y] += h[x] == h[y];
  re.first = x;
  re.second = y;
  return re;
}
void del(int x, int y, int val) {
  h[y] -= val;
  siz[y] -= siz[x];
  fa[x] = x;
}
void add(int o, int l, int r, int L, int R, pair<int, int> x) {
  if (l >= L && r <= R) {
    tree[o].push_back(x);
    return;
  }
  int mid = (l + r) >> 1;
  if (mid >= L) add(o << 1, l, mid, L, R, x);
  if (mid < R) add(o << 1 | 1, mid + 1, r, L, R, x);
}
int tp;
gu s[1000100];
void qu(int o, int l, int r) {
  int now = tp, sf = 0;
  for (int i = 0; i < tree[o].size(); ++i) {
    pair<int, int> now = tree[o][i];
    s[++tp] = merge(now.first, now.second);
  }
  if (l == r) {
    ans[l] = siz[find(ask[l])];
  } else {
    int mid = (l + r) >> 1;
    qu(o << 1, l, mid);
    qu(o << 1 | 1, mid + 1, r);
  }
  while (tp != now) {
    if (s[tp].val != -1) del(s[tp].first, s[tp].second, s[tp].val);
    --tp;
  }
}
int main() {
  scanf("%d%d%d", &n, &q, &k);
  for (int i = 1; i <= n; ++i) fa[i] = i, siz[i] = 1, h[i] = 1;
  int days = 1;
  for (int i = 1; i <= q; ++i) {
    int op;
    scanf("%d", &op);
    if (op == 1) {
      int x, y;
      scanf("%d%d", &x, &y);
      Q.push((que){x, y, days, i});
    }
    if (op == 2) {
      int o;
      scanf("%d", &o);
      ask[i] = o;
    }
    if (op == 3) {
      ++days;
      while (!Q.empty() && Q.front().times <= days - k) {
        add(1, 1, q, Q.front().l, i - 1, make_pair(Q.front().x, Q.front().y));
        Q.pop();
      }
    }
  }
  while (!Q.empty()) {
    add(1, 1, q, Q.front().l, q, make_pair(Q.front().x, Q.front().y));
    Q.pop();
  }
  qu(1, 1, q);
  for (int i = 1; i <= q; ++i) {
    if (ask[i]) printf("%d\n", ans[i]);
  }
}
