#include<bits/stdc++.h>
#define ll long long
#define N 200005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
const ll mod=998244353;
ll ksm(ll t,ll x) {
ll ans=1;
for(;x;x>>=1,t=tt%mod)
if(x&1) ans=anst%mod;
return ans;
}
int n,y,op;
namespace task0 {
map<int,int>e[N];
void solve() {
for(int i=1;i<n;i++) {
int a=Get(),b=Get();
e[a][b]=e[b][a]=1;
}
int cnt=0;
for(int i=1;i<n;i++) {
int a=Get(),b=Get();
if(e[a][b]) cnt++;
}
cout<<ksm(y,n-cnt);
}
}
struct road {
int to,nxt;
}s[N<<1];
int h[N],cnt;
void add(int i,int j) {s[++cnt]=(road) {j,h[i]};h[i]=cnt;}
namespace task1 {
ll f[N][2];
ll invn,invy;
void dfs(int v,int fr) {
f[v][0]=f[v][1]=n;
for(int i=h[v];i;i=s[i].nxt) {
int to=s[i].to;
if(tofr) continue ;
dfs(to,v);
ll t0=f[v][0],t1=f[v][1];
f[v][0]=f[v][1]=0;
f[v][0]=t0f[to][1]%mod;
f[v][1]=t1f[to][1]%mod;
(f[v][0]+=t0f[to][0]%modinvn%modinvy)%=mod;
(f[v][1]+=(t1f[to][0]+t0f[to][1])%modinvn%mod*invy)%=mod;
}
}
void solve() {
if(y1) {cout<<ksm(n,n-2);return ;}
for(int i=1;i<n;i++) {
int a=Get(),b=Get();
add(a,b),add(b,a);
}
invn=ksm(n,mod-2);
invy=ksm(y,mod-2)-1;
dfs(1,0);
cout<<f[1][1]ksm(n,2(mod-2))%mod*ksm(y,n)%mod;
}
}
void NTT(ll a,int d,int flag) {
static int rev[N<<2];
static ll G=3;
int n=1<<d;
for(int i=0;i<n;i++) rev[i]=(rev[i>>1]>>1)|((i&1)<<d-1);
for(int i=0;i<n;i++) if(i<rev[i]) swap(a[i],a[rev[i]]);
for(int s=1;s<=d;s++) {
int len=1<<s,mid=len>>1;
ll w=flag==1?ksm(G,(mod-1)/len):ksm(G,mod-1-(mod-1)/len);
for(int i=0;i<n;i+=len) {
ll t=1;
for(int j=0;j<mid;j++,t=tw%mod) {
ll u=a[i+j],v=a[i+j+mid]*t%mod;
a[i+j]=(u+v)%mod;
a[i+j+mid]=(u-v+mod)%mod;
}
}
}
if(flag==-1) {
ll inv=ksm(n,mod-2);
for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
}
}
void Inv(ll *inv,int d,ll a) {
static ll A[N<<2];
if(d==0) {
inv[0]=ksm(a[0],mod-2);
return ;
}
Inv(inv,d-1,a);
for(int i=0;i<1<<d+1;i++) A[i]=0;
for(int i=0;i<1<<d;i++) A[i]=a[i];
NTT(inv,d+1,1),NTT(A,d+1,1);
for(int i=0;i<1<<d+1;i++) inv[i]=(2inv[i]-inv[i]inv[i]%modA[i]%mod+mod)%mod;
NTT(inv,d+1,-1);
for(int i=1<<d;i<1<<d+1;i++) inv[i]=0;
}
void Der(ll a,int d) {
int n=1<<d;
for(int i=0;i<n-1;i++) a[i]=a[i+1](i+1)%mod;
a[n-1]=0;
}
void Int(ll *a,int d) {
int n=1<<d;
for(int i=n-1;i>0;i--) a[i]=a[i-1]*ksm(i,mod-2)%mod;
a[0]=0;
}
void Ln(ll *ln,int d,ll *a) {
static ll inv[N<<2];
static ll der[N<<2];
for(int i=0;i<1<<d+1;i++) der[i]=inv[i]=0;
for(int i=0;i<1<<d;i++) der[i]=a[i];
Inv(inv,d,a);
Der(der,d);
NTT(inv,d+1,1),NTT(der,d+1,1);
for(int i=0;i<1<<d+1;i++) ln[i]=der[i]*inv[i]%mod;
NTT(ln,d+1,-1);
for(int i=1<<d;i<1<<d+1;i++) ln[i]=0;
Int(ln,d);
}
void Exp(ll *exp,int d,ll a) {
static ll A[N<<2],ln[N<<2];
if(d==0) {
exp[0]=1;
return ;
}
Exp(exp,d-1,a);
for(int i=0;i<1<<d+1;i++) A[i]=ln[i]=0;
for(int i=1<<d;i<1<<d+1;i++) exp[i]=0;
for(int i=0;i<1<<d;i++) A[i]=a[i];
Ln(ln,d,exp);
NTT(A,d+1,1),NTT(ln,d+1,1),NTT(exp,d+1,1);
for(int i=0;i<1<<d+1;i++) exp[i]=exp[i](1-ln[i]+A[i]+mod)%mod;
NTT(exp,d+1,-1);
for(int i=1<<d;i<1<<d+1;i++) exp[i]=0;
}
ll A[N<<2],inv[N<<2];
ll ln[N<<2],ex[N<<2];
namespace task2 {
ll f[N<<2],g[N<<2];
ll fac[N],ifac[N];
void solve() {
if(y==1) {
cout<<ksm(n,n-2)*ksm(n,n-2)%mod;
return ;
}
fac[0]=1;
for(int i=1;i<=n;i++) fac[i]=fac[i-1]i%mod;
ifac[n]=ksm(fac[n],mod-2);
for(int i=n-1;i>=0;i--) ifac[i]=ifac[i+1](i+1)%mod;
}
int main() {
n=Get(),y=Get(),op=Get();
if(op0) task0::solve();
else if(op1) task1solve();
else task2solve();
return 0;
}