# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
int deg[400010],id[400010];
ll pw2=2,ans=0;
deque<int> cur;
vector<deque<int> > ring;
struct Chain
{
	int head,tail;
	ll val[2];
	deque<int> que;
	Chain(int u,int v,int x,ll y)
	{
		head=u;tail=v;
		que.push_back(x);
		val[0]=0;val[1]=y;
	}
};
vector<Chain> chain;
void solve(int u,int v,int w)
{
	if(deg[v]&1) swap(u,v);
	if(deg[u]&1 && deg[v]&1)
	{
		int x=id[u],y=id[v],l1=chain[x].que.size(),l2=chain[y].que.size();
		if(x==y)
		{
			for(int i=0;i<l1;i++,chain[x].que.pop_front())
				cur.push_back(chain[x].que.front());
			cur.push_back(w);
			ring.push_back(cur);cur.clear();
		}
		else
		{
			if(l1<l2) swap(u,v),swap(x,y),swap(l1,l2);
			(ans+=mod-chain[x].val[1]+mod-chain[y].val[1])%=mod;
			if(chain[x].head==u)
			{
				(chain[x].val[0]+=pw2)%=mod;
				chain[x].que.push_front(w);
				if(chain[y].head==v)
				{
					chain[x].head=chain[y].tail;
					(chain[x].val[0]+=chain[y].val[0])%=mod;
					(chain[x].val[1]+=chain[y].val[1])%=mod;
					for(int i=0;i<l2;i++,chain[y].que.pop_front())
						chain[x].que.push_front(chain[y].que.front());
				}
				else
				{
					chain[x].head=chain[y].head;
					(chain[x].val[0]+=chain[y].val[(l2-1)&1])%=mod;
					(chain[x].val[1]+=chain[y].val[l2&1])%=mod;
					for(int i=0;i<l2;i++,chain[y].que.pop_back())
						chain[x].que.push_front(chain[y].que.back());
				}
				if((l2+1)&1) swap(chain[x].val[0],chain[x].val[1]);
			}
			else
			{
				(chain[x].val[(l1+1)&1]+=pw2)%=mod;
				chain[x].que.push_back(w);
				if(chain[y].head==v)
				{
					chain[x].tail=chain[y].tail;
					(chain[x].val[l1&1]+=chain[y].val[1])%=mod;
					(chain[x].val[(l1+1)&1]+=chain[y].val[0])%=mod;
					for(int i=0;i<l2;i++,chain[y].que.pop_front())
						chain[x].que.push_back(chain[y].que.front());
				}
				else
				{
					chain[x].tail=chain[y].head;
					(chain[x].val[l1&1]+=chain[y].val[l2&1])%=mod;
					(chain[x].val[(l1+1)&1]+=chain[y].val[(l2-1)&1])%=mod;
					for(int i=0;i<l2;i++,chain[y].que.pop_back())
						chain[x].que.push_back(chain[y].que.back());
				}
			}
			(ans+=chain[x].val[1])%=mod;
			id[chain[x].head]=id[chain[x].tail]=x;
		}
	}
	else if(deg[u]&1)
	{
		int x=id[v]=id[u];
		(ans+=mod-chain[x].val[1])%=mod;
		if(chain[x].head==u)
		{
			chain[x].head=v;
			chain[x].que.push_front(w);
			swap(chain[x].val[0],chain[x].val[1]);
			(chain[x].val[1]+=pw2)%=mod;
		}
		else
		{
			chain[x].tail=v;
			chain[x].que.push_back(w);
			(chain[x].val[chain[x].que.size()&1]+=pw2)%=mod;
		}
		(ans+=chain[x].val[1])%=mod;
	}
	else
	{
		chain.push_back(Chain(u,v,w,pw2));
		id[u]=id[v]=chain.size()-1;
		(ans+=pw2)%=mod;
	}
	deg[u]++;deg[v]++;
}
int main()
{
	int n1,n2,m,q,u,v,op;
	cin>>n1>>n2>>m;
	for(int i=1;i<=m;i++,pw2=pw2*2%mod)
	{
		scanf("%d%d",&u,&v);
		solve(u,v+n1,i);
	}
	cin>>q;
	while(q--)
	{
		scanf("%d",&op);
		if(op==1)
		{
			scanf("%d%d",&u,&v);
			solve(u,v+n1,++m);pw2=pw2*2%mod;
			cout<<ans<<endl<<flush;
		}
		else
		{
			int cnt=0;
			for(int i=0,sz=chain.size();i<sz;i++) cnt+=(chain[i].que.size()+1)/2;
			for(int i=0,sz=ring.size();i<sz;i++) cnt+=ring[i].size()/2;
			printf("%d",cnt);
			for(int i=0,s1=chain.size();i<s1;i++)
				for(int j=0,s2=chain[i].que.size();j*2<s2;j++)
					printf(" %d",chain[i].que[j*2]);
			for(int i=0,s1=ring.size();i<s1;i++)
				for(int j=0,s2=ring[i].size();j*2<s2;j++)
					printf(" %d",ring[i][j*2]);
			cout<<endl<<flush;
		}
	}
	return 0;
}