#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
// by zrt
// problem:
// 无论你在什么时候开始,重要的是开始以后就不要停止。
using namespace std ;
typedef long long LL ;
const double eps(1e-10) ;
const int inf(0x3f3f3f3f) ;
int n,m,k,S,T;
int h[55],x[405],p[405],_tot;
int H[2600],P[50000],X[50000],flow[50000],cap[50000],tot;
inline void add(int x,int y,int z){
P[++tot]=y;X[tot]=H[x];H[x]=tot;cap[tot]=flow[tot]=z;
}
inline void _add(int _x,int y){
p[++_tot]=y;x[_tot]=h[_x];h[_x]=_tot;
}
queue<int> q;
int d[2600];
bool bfs(){
memset(d,0,sizeof d);
d[S]=1;int x;q.push(S);
while(!q.empty()){
x=q.front();q.pop();
for(int i=H[x];i;i=X[i]){
if(flow[i]>0&&!d[P[i]]){
d[P[i]]=d[x]+1;
q.push(P[i]);
}
}
}
return d[T];
}
int dfs(int x,int a){
if(x==T||a==0) return a;
int f=a,tmp;
for(int i=H[x];i;i=X[i]){
if(flow[i]>0&&d[P[i]]==d[x]+1){
tmp=dfs(P[i],min(flow[i],a));
a-=tmp;
flow[i]-=tmp;
flow[i^1]+=tmp;
if(!a) break;
}
}
if(f==a) d[x]=-1;
return f-a;
}
int Dinic(int f){
while(f<k&&bfs()) f+=dfs(S,k-f);
return f;
}
bool ans[51][51];
struct N{
int x,y;
}Q[2600];
int pos[55][2];
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin) ;
freopen("out.txt","w",stdout) ;
#endif
while(~scanf("%d%d%d%d%d",&n,&m,&k,&S,&T)){
tot=_tot=1;memset(h,0,sizeof h);memset(H,0,sizeof H);
for(int i=0,x,y;i<m;i++){
scanf("%d%d",&x,&y);
_add(x,y);_add(y,x);
}
int flows(0);
for(int t=1;;t++){
for(int i=1;i<=n;i++){
add(i+(t-1)*n,i+t*n,inf);
add(i+t*n,i+(t-1)*n,0);
for(int j=h[i];j;j=x[j]){
add(i+(t-1)*n,p[j]+t*n,1);
add(p[j]+t*n,i+(t-1)*n,0);
}
}
add(T+t*n,T,inf);
add(T,T+t*n,0);
for(int i=1;i<=k;i++){
pos[i][0]=S;
}
if((flows=Dinic(flows))==k){
printf("%d\n",t);
for(int i=0;i<t;i++){
int num(0);
memset(ans,0,sizeof ans);
for(int j=1;j<=n;j++){
for(int k=H[j+i*n];k;k=X[k]){
if(cap[k]&&!flow[k]){
ans[j][P[k]-(i+1)*n]=1;
}
}
}
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
if(ans[j][k]&&!ans[k][j]){
Q[num].x=j,Q[num].y=k;num++;
}
}
}
printf("%d",num);
for(int ps=0;ps<num;ps++){
for(int j=1;j<=k;j++){
if(pos[j][i&1]==Q[ps].x){
pos[j][i&1]=0;
pos[j][(i&1)^1]=Q[ps].y;
printf(" %d %d",j,Q[ps].y);
break;
}
}
}
for(int j=1;j<=k;j++){
if(pos[j][i&1]) pos[j][(i&1)^1]=pos[j][i&1];
}
puts("");
}
break;
}
}
}
return 0 ;
}