#
#
#include<bits/stdc++.h>
#define pb push_back
#define eb emplace_back
#ifndef THIS_IS_JIAOHUTI
#define int long long
#endif
#define F(i,x,y) for(int i=x;i<=y;++i)
#define G(i,x,y) for(int i=x;i>=y;--i)
#define FD(x,y) for(int i=x;i*i<=y;++i)
#define GD(x,y) for(int i=x;i*i>=y;--i)
#define adde(x,y) z[x].eb(y);
#define Adde(x,y) z[x].eb(y),z[y].eb(x);
#define addew(x,y,w) z[x].eb(y,w)
#define Addew(x,y,w) z[x].eb(y,w),z[y].eb(x,w)
#define FIMX(X) memset(X,0x3f,sizeof X)
#define FIMI(X) memset(X,-0x3f,sizeof X)
#define FI0(X) memset(X,0,sizeof X)
#define FIN(X) memset(X,-1,sizeof X)
#define rng(X) X.begin(),X.end()
#define PII pair<int,int>
#define PDD pair<double,double>
#define PIII tuple<int,int,int>
#define VI vector<int>
#define VII vector<PII>
#define VID vector<pair<int,double>>
#define VDD vector<PDD>
using namespace std;
const int N=600100;
int n,m,s;
VI z[N];
int sz[N],dep[N],hev[N],top[N],up[N],dfn[N],back[N],a[N],xia[N];
void dfs(int u,int fa){
sz[u]=1,dep[u]=dep[fa]+1,up[u]=fa;
for(auto &v:z[u])if(v!=fa){
dfs(v,u),sz[u]+=sz[v];
xia[u]=v;
if(sz[hev[u]]<sz[v])hev[u]=v;
}
}
int idx;
void dfs2(int u,int Top,int fa){
top[u]=Top;
dfn[u]=++idx,back[idx]=u;
if(hev[u])dfs2(hev[u],Top,u);
for(auto &v:z[u])if(v!=fa&&v!=hev[u])
dfs2(v,v,u);
}
int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]>dep[top[v]])
u=up[top[u]];
else
v=up[top[v]];
}
if(dep[u]<dep[v])
return u;
return v;
}
namespace yhb{
struct qwq{
int l,r,sum,tag;
void init(int p){
l=r=p;sum=1,tag=0;
}
void yhb(int x){
sum=(r-l+1)*x,tag=x;
}
}z[N<<2];
qwq operator+(const qwq&l,const qwq&r){
return {l.l,r.r,l.sum+r.sum,0ll};
}
void build(int l,int r,int rt){
if(l==r)return z[rt].init(l);
int mid=l+r>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
z[rt]=z[rt<<1]+z[rt<<1|1];
}
void pushyhb(int rt){
if(z[rt].tag){
z[rt<<1].yhb(z[rt].tag);
z[rt<<1|1].yhb(z[rt].tag);
z[rt].tag=0;
}
}
void modify(int l,int r,int rt,int ll,int rr,int v){
if(l==r){z[rt].sum=v;return;}
int mid=l+r>>1;pushyhb(rt);
if(ll<=mid)modify(l,mid,rt<<1,ll,rr,v);
if(mid<rr)modify(mid+1,r,rt<<1|1,ll,rr,v);
z[rt]=z[rt<<1]+z[rt<<1|1];
}
int query(int l,int r,int rt,int ll,int rr){
if(ll<=l&&r<=rr)return z[rt].sum;
if(ll>rr)return 0;
int mid=l+r>>1,s=0;pushyhb(rt);
if(ll<=mid&&mid<rr)return query(l,mid,rt<<1,ll,rr)+query(mid+1,r,rt<<1|1,ll,rr);
if(mid<rr)return query(mid+1,r,rt<<1|1,ll,rr);
return query(l,mid,rt<<1,ll,rr);
}
}
void lnk_modify(int u,int v,int w){
while(top[u]!=top[v]){
if(dep[up[top[u]]]<dep[up[top[v]]])
swap(u,v);
yhb::modify(1,n,1,dfn[top[u]],dfn[u],w);
u=up[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
yhb::modify(1,n,1,dfn[u]+1,dfn[v],w);
}
int lnk_query(int u,int v){
int s=0;
while(top[u]!=top[v]){
if(dep[up[top[u]]]<dep[up[top[v]]])
swap(u,v);
s+=yhb::query(1,n,1,dfn[top[u]],dfn[u]);
u=up[top[u]];
}
if(dep[u]>dep[v])swap(u,v);
s+=yhb::query(1,n,1,dfn[u]+1,dfn[v]);
return s;
}
namespace __{
int fa[N];
int find(int x){
return x==fa[x]?x:fa[x]=find(fa[x]);
} bool Union(int x,int y){
if(find(x)!=find(y)){
fa[find(x)]=find(y);
return 1;
}
return 0;
}
} using namespace __;
PII ed[N];
struct Query{
int o,x,y;
}Q[N];
#ifndef THIS_IS_JIAOHUTI
signed main(){
cin>>n>>m;
set<PII>rem;
F(i,1,m){
int u,v;cin>>u>>v;
ed[i]={u,v};
rem.insert({u,v});
}
F(i,1,n)fa[i]=i;
int q=0,o;
while(cin>>o,~o){
int x,y;cin>>x>>y;
Q[++q]={o,x,y};
if(o==0)rem.erase({x,y});
}
for(auto &[x,y]:rem){
if(!Union(x,y)){
lnk_modify(x,y,0);
}
else{
Adde(x,y);
}
}
VI res;
dfs(1,0),dfs2(1,1,0);
yhb::build(1,n,1);
F(i,1,n)fa[i]=i;
F(i,1,n)for(auto &j:z[i])
Union(i,j);
G(i,q,1){
auto [o,u,v]=Q[i];
if(o==1)
res.emplace_back(lnk_query(u,v));
else{
if(!Union(u,v)){
lnk_modify(u,v,0);
}
}
}
reverse(rng(res));
for(auto &x:res)
cout<<x<<'\n';
}
#else
#define NO_MAIN
void no_main() {
puts("pwp");
}
#endif