#include<bits/stdc++.h>
bool M1;
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define ROF(i,a,b) for(int i=(a);i>=(b);--i)
#define mp(a,b) make_pair(a,b)
#define pll pair<long long,long long>
#define pii pair<int,int>
#define fi first
#define se second
#define eb emplace_back
#define ep emplace
#define pc __builtin_popcount
using namespace std;
typedef long long ll;
typedef double db;
const int N=5e5+5;
const int M=4e6;
const int inf=0x3f3f3f3f;
const int INF=0x7f7f7f7f;
const int mod=19260817;
inline int read();
int n,m,k;
int fac[M+5];
int fp(int a,int b){
int ans=1;
for(;b;b>>=1){
if(b&1)ans=1ll*ans*a%mod;
a=1ll*a*a%mod;
}
return ans;
}
int C(int n,int m){
return 1ll*fac[n]*fp(fac[m],mod-2)%mod*fp(fac[n-m],mod-2)%mod;
}
int f[N];ll sz[N];
int Get(int k){return f[k]==k?k:f[k]=Get(f[k]);}
int num[N],c[N];
struct node{
int opt,x,num,col;
}q[N];
struct ed{
int u,v;
}e[N];
bool vis[N];
int ans[N];
map<int,ll>buc[N];
int sum[N];
void Merge(int u,int v){
int fu=Get(u),fv=Get(v);
if(fu==fv)return;
if(sum[fu]<sum[fv])swap(fu,fv);
f[fv]=fu;sz[fu]+=sz[fv];
for(auto x:buc[fv]){
int _a=x.fi;ll _b=x.se;
if(buc[fu][_a]==0)sum[fu]++;
buc[fu][_a]+=_b;
}
}
bool M2;
signed main()
{
n=read(),m=read();int Q=read();assert(n<=N-5&&m<=N-5&&Q<=N-5);
FOR(i,1,n){
f[i]=i;
num[i]=read();sz[i]+=num[i];
c[i]=read();
if(buc[i][c[i]]==0)sum[i]++;
buc[i][c[i]]+=num[i];
}
FOR(i,1,m)e[i]={read(),read()};
FOR(i,1,Q){
q[i].opt=read();
if(q[i].opt==1){
q[i].x=read(),q[i].num=read(),q[i].col=read();
if(buc[q[i].x][q[i].col]==0)sum[q[i].x]++;
buc[q[i].x][q[i].col]+=q[i].num;
sz[q[i].x]+=q[i].num;
}
else if(q[i].opt==2){
q[i].x=read();
vis[q[i].x]=1;
}
else{
q[i].x=read(),q[i].num=read(),q[i].col=read();
}
}
fac[0]=1;
FOR(i,1,M)fac[i]=1ll*fac[i-1]*i%mod;
FOR(i,1,m){
if(vis[i])continue;
int u=e[i].u,v=e[i].v;
Merge(u,v);
}
ROF(i,Q,1){
int opt=q[i].opt,x=q[i].x,Num=q[i].num,col=q[i].col;
if(opt==1){
int fu=Get(x);
sz[fu]-=Num;
buc[fu][col]-=Num;
if(!buc[fu][col])sum[fu]--;
}
else if(opt==2){
int u=e[x].u,v=e[x].v;
Merge(u,v);
}
else{
int fu=Get(x);int g=buc[fu][col];
int down=C(sz[fu],Num),up=C(g,Num);
down=fp(down,mod-2);
ans[i]=(1ll*up*down%mod);
}
}
FOR(i,1,Q)if(q[i].opt==3)printf("%d\n",ans[i]);
cerr<<"\n"<<abs(&M1-&M2)/1024.0/1024.0<<"MB";
return 0;
}
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return f*x;
}