#include using namespace std; typedef long long ll; typedef pair P; typedef tuple PP; typedef vector vi; typedef vector vvi; typedef vector

vp; typedef vector vvp; typedef vector vb; #define rep(i,n) for(ll i=0;i<(ll)(n);i++) #define REP(i,k,n) for(ll i=(ll)(k);i<(ll)(n);i++) #define fi first #define se second #define all(a) a.begin(),a.end() #define rosrt(a) {sort(all(a));reverse(all(a));} #define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());} #define lb(v,k) (lower_bound(all(v),k)-v.begin()) #define pb emplace_back template bool chmin(T&a,T b){if(a>b){a=b;return true;}return false;} template bool chmax(T&a,T b){if(a void out(T a){cout< void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout< void outvv(T v){for(auto x:v)outv(x);} template void outp(T p){cout<<'('< void outvp(T v){for(auto x:v)cout<<'('< class segtree{ ll N=1; P g=P(-1,-1); vector v; vp seg; P f(P a,P b){return max(a,b);} public: segtree(ll n){ while(N(n); } void add(ll i,ll x){ v[i].push(x); seg[i+N-1].fi=v[i].top(); i+=N-1; while(i>0){ i=(i-1)/2; seg[i]=f(seg[i*2+1],seg[i*2+2]); } } void er(ll i){ v[i].pop(); if(v[i].size())seg[i+N-1].fi=v[i].top(); else seg[i+N-1].fi=-1; i+=N-1; while(i>0){ i=(i-1)/2; seg[i]=f(seg[i*2+1],seg[i*2+2]); } } P get(ll a,ll b){ P res=P(-1,-1); a+=N-1;b+=N-1; while(a>1;b=(b-1)>>1; } return res; } }; int main(){ ll n,m,q;cin>>n>>m>>q; vvp g(n); rep(i,m){ ll a,b;cin>>a>>b; a--;b--; g[a].pb(b,i);g[b].pb(a,i); } vi lk(n),dep(n,-1); function dfs=[&](ll i,ll p){ lk[i]=dep[i]; for(auto x:g[i])if(x.fi!=p){ if(dep[x.fi]==-1){ dep[x.fi]=dep[i]+1; dfs(x.fi,i); chmin(lk[i],lk[x.fi]); } else{ chmin(lk[i],dep[x.fi]); } } };dep[0]=0;dfs(0,-1); vb is_bridge(m,false); function dfs2=[&](ll i,ll e){ if(e!=-1&&lk[i]==dep[i])is_bridge[e]=true; for(auto x:g[i])if(dep[x.fi]==dep[i]+1)dfs2(x.fi,x.se); };dfs2(0,-1); ll cmp=0; vi gr(n,-1); function dfs3=[&](ll i){ for(auto x:g[i])if(!is_bridge[x.se]&&gr[x.fi]==-1){ gr[x.fi]=gr[i];dfs3(x.fi); } };rep(i,n)if(gr[i]==-1){gr[i]=cmp++;dfs3(i);} vvi tree(cmp); rep(i,n)for(auto x:g[i])if(is_bridge[x.se]){ tree[gr[i]].pb(gr[x.fi]); } n=cmp; vvi G=tree; vi sub(n); function initHLD=[&](ll i,ll p){ sub[i]=1; ll ma=0; rep(j,G[i].size())if(G[i][j]!=p){ initHLD(G[i][j],i); sub[i]+=sub[G[i][j]]; if(chmax(ma,sub[G[i][j]]))swap(G[i][j],G[i][0]); } };initHLD(0,-1); vi head(n),par(n); function initHLD2=[&](ll i,ll p){ par[i]=p; rep(j,G[i].size())if(G[i][j]!=p){ if(j==0)head[G[i][j]]=head[i]; else head[G[i][j]]=G[i][j]; initHLD2(G[i][j],i); } };head[0]=0;initHLD2(0,-1); vi euler(n); ll c=0; function tour=[&](ll i){ euler[i]=c++; for(ll x:G[i])if(x!=par[i])tour(x); };tour(0); auto lca=[&](ll a,ll b){ while(head[a]!=head[b]){ if(dep[head[a]]dep[b])return b; return a; }; P res; segtree seg(n); auto do_path=[&](ll a,ll b){ while(head[a]!=head[b]){ if(dep[head[a]]>t; if(t==1){ ll a,b;cin>>a>>b; a=gr[a-1]; seg.add(euler[a],b); } else{ ll a,b;cin>>a>>b; res=P(-1,-1); do_path(gr[a-1],gr[b-1]); out(res.fi); if(res.fi!=-1)seg.er(res.se); } } }