RT
#include<bits/stdc++.h>
#define N 200005
#define M 500005
using namespace std;
namespace fastio
{
struct reader
{
template<typename T>reader&operator>>(T&x)
{
char c=getchar();short f=1;
while(c<'0'||c>'9')
{if(c=='-')f*=-1;c=getchar();}
x=0;
while(c>='0'&&c<='9')
x=(x<<1)+(x<<3)+(c^48),c=getchar();
x*=f;
return *this;
}
}cin;
struct writer
{
template<typename T>writer&operator<<(T x)
{
if(x==0)
return putchar('0'),*this;
if(x<0)
putchar('-'),x=-x;
static int sta[45];int top=0;
while(x)
sta[++top]=x%10,x/=10;
while(top)
putchar(sta[top]+'0'),--top;
return *this;
}
}cout;
#define cin fastio::cin
#define cout fastio::cout
};
int n,m,qq,cnt=0,tot=1,cnt1=0;
int fa[N],ans[M],dep[N],siz[N],son[N],top[N],dfn[N],head[N],w[N];
map<pair<int,int>,int> db;
queue<pair<int,int> > qqq;
struct edge{
int to,next;
}e[M<<1];
struct tu{
int u,v;
}t[M];
struct qury{
int c,a,b;
}q[M];
struct node{
int l,r;
int sum,tg;
}a[N<<2];
///////////////////////////////////////
int find(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find(fa[x]);
}
void ade(int u,int v){
e[tot]=(edge){v,head[u]};
head[u]=tot++;
e[tot]=(edge){u,head[v]};
head[v]=tot++;
}
void dfs1(int nw,int f){
dep[nw]=dep[f]+1;
fa[nw]=f;
siz[nw]=1;
int qwe=-1;
for(int i=head[nw];i>0;i=e[i].next){
int er=e[i].to;
if(er==f)
continue;
dfs1(er,nw);
siz[nw]+=siz[er];
if(qwe<siz[er]){
qwe=siz[er];
son[nw]=er;
}
}
}
void dfs2(int nw,int t){
top[nw]=t;
dfn[nw]=++cnt;
if(!son[nw])
return ;
dfs2(son[nw],t);
w[dfn[son[nw]]]=1;
for(int i=head[nw];i>0;i=e[i].next){
int er=e[i].to;
if(er==son[nw]||er==fa[nw])
continue;
dfs2(er,er);
w[dfn[er]]=1;
}
}
///////////////////////////////////////
void push_up(int aa){
a[aa].sum=a[aa*2].sum+a[aa*2+1].sum;
return ;
}
void push_down(int aa){
if(a[aa].tg){
a[aa*2].sum=0;
a[aa*2+1].sum=0;
a[aa*2].tg=1;
a[aa*2+1].tg=1;
a[aa].tg=0;
}
return ;
}
void build(int aa,int l,int r){
a[aa].l=l;
a[aa].r=r;
a[aa].tg=0;
if(l==r){
a[aa].sum=w[l];
return ;
}
int mid=(l+r)>>1;
build(aa*2,l,mid);
build(aa*2+1,mid+1,r);
push_up(aa);
return ;
}
void modify(int aa,int l,int r){
if(a[aa].sum==0)
return ;
if(a[aa].l>=l&&a[aa].r<=r){
a[aa].sum=0;
a[aa].tg=1;
return ;
}
push_down(aa);
int mid=(a[aa].l+a[aa].r)>>1;
if(l<=mid)
modify(aa*2,l,r);
if(r>mid)
modify(aa*2+1,l,r);
push_up(aa);
return ;
}
int query(int aa,int l,int r){
if(a[aa].sum==0)
return 0;
if(a[aa].l>=l&&a[aa].r<=r)
return a[aa].sum;
push_down(aa);
int sd=0,mid=(a[aa].l+a[aa].r)>>1;
if(l<=mid)
sd+=query(aa*2,l,r);
if(r>mid)
sd+=query(aa*2+1,l,r);
push_up(aa);
return sd;
}
///////////////////////////////////////
void mchain(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
modify(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(x==y)
return ;
if(dep[x]>dep[y])
swap(x,y);
modify(1,dfn[x]+1,dfn[y]);
return ;
}
int qchain(int x,int y){
int sd=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
sd+=query(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if(x==y)
return sd;
if(dep[x]>dep[y])
swap(x,y);
sd+=query(1,dfn[x]+1,dfn[y]);
return sd;
}
///////////////////////////////////////
int main(){
// freopen("lane.in","r",stdin);
// freopen("lane.out","w",stdout);
cin>>n>>m>>qq;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++){
int aaa,bbb;
cin>>aaa>>bbb;
if(aaa>bbb)
swap(aaa,bbb);
t[i].u=aaa;
t[i].v=bbb;
db[make_pair(aaa,bbb)]=1;
}
for(int i=1;i<=qq;i++){
cin>>q[i].c>>q[i].a>>q[i].b;
if(q[i].a>q[i].b)
swap(q[i].a,q[i].b);
if(!q[i].c)
db[make_pair(q[i].a,q[i].b)]=0;
}
for(int i=1;i<=m;i++){
int as=find(t[i].u);
int bs=find(t[i].v);
if(db[make_pair(t[i].u,t[i].v)]){
if(as==bs)
qqq.push(make_pair(t[i].u,t[i].v));
else{
fa[as]=bs;
ade(t[i].u,t[i].v);
}
}
}
dfs1(1,1);
dfs2(1,1);
build(1,1,n);
while(!qqq.empty()){
mchain(qqq.front().first,qqq.front().second);
qqq.pop();
}
for(int i=qq;i>=1;i--){
if(q[i].c==1){
cnt1++;
ans[cnt1]=qchain(q[i].a,q[i].b);
}
else
mchain(q[i].a,q[i].b);
}
for(int i=cnt1;i>=1;i--){
cout<<ans[i];
putchar('\n');
}
// fclose(stdin);
// fclose(stdout);
return 0;
}