#include #include #include #include #include #define LL long long #define REP(i, n) for(int i = 0;i < (int)(n);i++) #define ALL(x) (x).begin(),(x).end() using namespace std; struct Edge{ int to,cap,rev,no; Edge(int t,int c,int r,int n){ to = t; cap = c; rev = r; no = n; } }; typedef vector Edges; typedef vector Graph; void addEdge(int from,int to,int cap,int no,Graph &g){ g[from].push_back(Edge(to,cap,g[to].size(),no)); g[to].push_back(Edge(Edge(from,0,g[from].size()-1,-1))); } int N,M; Graph g; int used[305]; int level[305]; void levelize(int s){ level[s] = 0; queue q;q.push(s); while(!q.empty()){ int n = q.front();q.pop(); for(Edges::iterator it=g[n].begin() ; it!=g[n].end() ; it++){ if(it->cap>0 && level[it->to]<0){ level[it->to] = level[n]+1; q.push(it->to); } } } } int augment(int v,int t,int f){ if(v==t||f==0)return f; for(int &i=used[v] ; i<(int)g[v].size() ; i++){ Edge &e = g[v][i]; if(e.cap>0 && level[v]0){ e.cap -= d; g[e.to][e.rev].cap += d; return d; } } } return 0; } int dinic(int s,int t){ int res = 0; const int INF = 1<<30; while(true){ memset(level,-1,sizeof(level)); levelize(s); if(level[t]<0)break; memset(used,0,sizeof(used)); for(int f;(f=augment(s,t,INF))>0 ; res +=f); } return res; } int main(void) { while(~scanf("%d%d",&N,&M)){ g.assign(N,Edges(0,Edge(0,0,0,0))); REP(i,M){ int x,y; scanf("%d%d",&x,&y); addEdge(x-1,y-1,1,-1,g); addEdge(y-1,x-1,1,i+1,g); } int S,T; scanf("%d%d",&S,&T); int f = dinic(S-1,T-1); vector edge; REP(i,N){ for(int j=0 ; j<(int)g[i].size() ; j++){ if(g[i][j].no>0 && g[i][j].cap==0){ edge.push_back(g[i][j].no); } } } printf("%d\n%d\n",f,edge.size()); REP(i,edge.size()){ printf("%d\n",edge[i]); } } return 0; }