1 #include "bits/stdc++.h"
2 using namespace std;
3 typedef long long LL;
4 const int MAX=205,mod=45989;
5 int n,m,t,st,ed;
6 struct Mat{
7 int x,y;
8 int mat[MAX][MAX];
9 Mat(){x=y=0;memset(mat,0,sizeof(mat));}
10 friend Mat operator * (Mat cc,Mat tt) {
11 Mat an;int i,j,k;
12 an.x=cc.x,an.y=tt.y;
13 for (i=1;i<=cc.x;i++)
14 for (k=1;k<=cc.y;k++)
15 if (cc.mat[i][k])
16 for (j=1;j<=an.y;j++)
17 an.mat[i][j]=(an.mat[i][j]+cc.mat[i][k]*tt.mat[k][j])%mod;
18 return an;
19 }
20 friend Mat operator ^(Mat cc,int tt) {
21 Mat an;int i,j;
22 an.x=cc.x,an.y=cc.y;
23 for (i=1;i<=cc.x;i++) an.mat[i][i]=1;
24 while (tt){
25 if (tt&1) an=an*cc;
26 cc=cc*cc,tt>>=1;
27 }
28 return an;
29 }
30 void out(){
31 int i,j;
32 for (i=1;i<=x;i++){
33 for (j=1;j<=y;j++)
34 printf("%d ",mat[i][j]);
35 printf("\n");
36 }
37 printf("\n");
38 }
39 }a,b;
40 struct Edge{int x,y;}edge[1005];
41 int tot,head[MAX],adj[1005],next[1005];
42 void addedge(int u,int v){tot++;adj[tot]=v,next[tot]=head[u],head[u]=tot,edge[tot].x=u,edge[tot].y=v;}
43 inline int read(){
44 int an=0,x=1;char c=getchar();
45 while (c<'0' || c>'9') {if (c=='-') x=-1;c=getchar();}
46 while (c>='0' && c<='9') {an=(an<<3)+(an<<1)+c-'0';c=getchar();}
47 return an*x;
48 }
49 int main(){
50 freopen ("walk.in","r",stdin);freopen ("walk.out","w",stdout);
51 int i,j,x,y;tot=1;
52 n=read(),m=read(),t=read(),st=read(),ed=read();st++,ed++;
53 for (i=1;i<=m;i++){
54 x=read(),y=read();x++,y++;
55 addedge(x,y),addedge(y,x);
56 }
57 a.x=a.y=b.x=b.y=tot;
58 for (i=head[st];i;i=next[i]) a.mat[1][i]++;
59 for (i=2;i<=tot;i++)
60 for (j=2;j<=tot;j++)
61 if (edge[i].y==edge[j].x && i!=(j^1))
62 b.mat[i][j]++;
63 a=a*(b^(t-1));
64 int ans=0;
65 for (i=head[ed];i;i=next[i])
66 ans+=a.mat[1][i^1];
67 printf("%d",ans%mod);
68 return 0;
69