#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,t) for (int i=s;i<=t;i++)
#define pi acos(-1)
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
typedef pair<PII, PII> PPP;
typedef pair<PII, int> PPI;
typedef pair<int, PII> PIP;
#define repp(i,s,t) for (int i=s;i>=t;i--)
template<class T> T sqr(T x) {return x*x;}
#define debug(x) cerr<<#x"="<<(x)<<endl;
#define pb(x) push_back(x);
#define ori(x) x-'a'
const int maxn = 50001;
int father[maxn], sum[maxn], sz[maxn], color[maxn], lefts[maxn], rights[maxn], tag[maxn];
vector<int> g[maxn];
int n,m,x,y,z;
const int maxm = 1e5 + 10;
PIP query[maxm];
PII edge[maxn];
int cnt;
int f[maxn];
int q, fat;
int u,v,ans;
int find(int k)
{
	if (f[k] != k) f[k] = find(f[k]);
	return f[k];
}
inline void update(int &k)
{
	sz[k] = sz[rights[k]] + sz[lefts[k]] + 1;
	sum[k] = sum[rights[k]] + sum[lefts[k]] + color[k];
	if (tag[k])
	{
		sum[k] = sz[k];
		color[k] = 1;
		tag[k] = 0;
		color[lefts[k]] = color[rights[k]] = 1;
		tag[rights[k]] = tag[lefts[k]] = 1;
		sum[rights[k]] = sz[rights[k]];
		sum[lefts[k]] = sz[lefts[k]];
	}
}
inline void lefts_rotate(int &k)
{
	fat=father[k];
	if (tag[fat])
	{
		tag[fat] = 0;
		color[lefts[fat]] = color[rights[fat]] = 1;
		tag[rights[fat]] = tag[lefts[fat]] = 1;
		sum[rights[fat]] = sz[rights[fat]];
		sum[lefts[fat]] = sz[lefts[fat]];
	}
	if (tag[k])
	{
		tag[k] = 0;
		color[lefts[k]] = color[rights[k]] = 1;
		tag[rights[k]] = tag[lefts[k]] = 1;
		sum[rights[k]] = sz[rights[k]];
		sum[lefts[k]] = sz[lefts[k]];
	}
	if (lefts[father[fat]]==fat) lefts[father[fat]]=k;
	if (rights[father[fat]]==fat) rights[father[fat]]=k;
	rights[fat]=lefts[k];
	lefts[k]=fat;
	father[k]=father[fat];
	father[fat]=k;
	father[rights[fat]]=fat;
	update(fat);
}
inline void rights_rotate(int &k)
{
	fat=father[k];
	if (tag[fat])
	{
		tag[fat] = 0;
		color[lefts[fat]] = color[rights[fat]] = 1;
		tag[rights[fat]] = tag[lefts[fat]] = 1;
		sum[rights[fat]] = sz[rights[fat]];
		sum[lefts[fat]] = sz[lefts[fat]];
	}
	
	if (tag[k])
	{
		tag[k] = 0;
		color[lefts[k]] = color[rights[k]] = 1;
		tag[rights[k]] = tag[lefts[k]] = 1;
		sum[rights[k]] = sz[rights[k]];
		sum[lefts[k]] = sz[lefts[k]];
	}
	if (lefts[father[fat]]==fat) lefts[father[fat]]=k;
	if (rights[father[fat]]==fat) rights[father[fat]]=k;
	lefts[fat]=rights[k];
	rights[k]=fat;
	father[k]=father[fat];
	father[fat]=k;
	father[lefts[fat]]=fat;
	update(fat);
}
inline void splay(int &u) 
{
	while (father[u] && (lefts[father[u]]==u || rights[father[u]]==u))
	{
		if (rights[father[u]]==u) lefts_rotate(u);
		else rights_rotate(u);
	}
	update(u);
}
inline void access(int &x)
{
	u=x;
	v=0;
	while (u)
	{
		splay(u);
		rights[u]=v;
		update(u);
		if (v) father[v]=u;
		v=u;
		u=father[u];
	}
}
void dfs(int k, int last = -1)
{
	for (int i = 0;i<g[k].size();i++)
	if (g[k][i] != last)
	{
		father[g[k][i]] = k;
		dfs(g[k][i], k);
	}
}

int main()
{
	int testdata;
	vector<int> anslist;
	scanf("%d",&testdata);
	map<PII, int> tree;
	rep(_t, 1, testdata)
	{
		printf("Case #%d:\n", _t);
		tree.clear();
		anslist.clear();
		memset(lefts,0,sizeof(lefts));
		memset(rights,0,sizeof(rights));
		memset(sz,0,sizeof(sz));
		memset(sum,0,sizeof(sum));
		memset(father,0,sizeof(father));
		memset(tag,0,sizeof(tag));
		memset(color,0,sizeof(color));

		scanf("%d%d%d",&n,&m,&q);
		rep(i,1,n) g[i].clear();
		rep(i,1,m)
		{
			scanf("%d%d",&x,&y);
			if (x > y) swap(x,y);
			tree[PII(x,y)]++;
			edge[i] = PII(x,y);
		}
		rep(i,1,q)
		{
			scanf("%d%d%d",&x,&y,&z);
			if (x == 1)
			{
				if (y > z) swap(y,z);
				tree[PII(y,z)]--;
			}
			query[i] = PIP(x, PII(y, z));
		}
		rep(i,1,n) f[i] = i;
		int cnt = 0;

		rep(i,1,m)
		{
			if (tree[PII(edge[i].first, edge[i].second)])
			{
				int fx = find(edge[i].first);
				int fy = find(edge[i].second);
				int x = edge[i].first;
				int y = edge[i].second;
				if (fx != fy)
				{
					tree[PII(x,y)]--;				
					f[fx] = fy;			
					cnt++;
					g[edge[i].first].push_back(edge[i].second);
					g[edge[i].second].push_back(edge[i].first);
					if (cnt == n - 1) break;
				}
			}
		}	
		dfs(1);
		for (auto it = tree.begin(); it != tree.end(); it++)
			if (it->second)
			{
				int x = it->first.first;
				int y = it->first.second;
				access(x);
				u = y;
				v = 0;
				splay(y);
				if (father[y] == 0)
				{
					tag[rights[y]] = 1;
					color[rights[y]] = 1;
					sum[rights[y]] = sz[rights[y]];
				}
				else
				{
					while (u)
					{
						splay(u);
						if (father[u] == 0) // merge
						{
							tag[rights[u]] = tag[v] = 1;
							color[rights[u]] = color[v] = 1;
							sum[rights[u]] = sz[rights[u]];
							sum[v] = sz[v];
						}
						rights[u] = v;
						if (v) father[v] = u;
						update(u);
						v = u;
						u = father[u];
					}
				}
			}

		repp(i,q,1)
		{
			if (query[i].first == 2)
			{
				x = query[i].second.first;
				y = query[i].second.second;
				access(x);
				u = y;
				v = 0;
				splay(y);
				if (father[y] == 0) //y is ances of x
					ans = sz[rights[y]] - sum[rights[y]];
				else
				{
					while (u)
					{
						splay(u);
						if (father[u] == 0) // merge
						{
							ans = sz[rights[u]] - sum[rights[u]]
							+ sz[v] - sum[v];
						}
						rights[u] = v;
						if (v) father[v] = u;
						update(u);
						v = u;
						u = father[u];
					}
				}
				anslist.push_back(ans);
			}
			else
			{
				x = query[i].second.first;
				y = query[i].second.second;
				access(x);
				u = y;
				v = 0;
				splay(y);
				if (father[y] == 0)
				{
					tag[rights[y]] = 1;
					color[rights[y]] = 1;
					sum[rights[y]] = sz[rights[y]];
				}
				else
				{
					while (u)
					{
						splay(u);
						if (father[u] == 0) // merge
						{
							tag[rights[u]] = tag[v] = 1;
							color[rights[u]] = color[v] = 1;
							sum[rights[u]] = sz[rights[u]];
							sum[v] = sz[v];
						}
						rights[u] = v;
						if (v) father[v] = u;
						update(u);
						v = u;
						u = father[u];
					}
				}
			}
		}
		for (int i = anslist.size() - 1; i >= 0; i--)
			printf("%d\n", anslist[i]);

		
	}
}

