#include <bits/stdc++.h>

using namespace std;

const int inf = 1 << 25;

struct edge
{
  int to, cap, rev, id, isrev;
  edge(){}
  edge(int to, int cap, int rev, int id, int isrev):to(to), cap(cap), rev(rev), id(id), isrev(isrev){}
};

struct Dinic
{
  vector< vector<edge> > G;
  vector<int> level, iter;
  Dinic(int V):G(V), level(V), iter(V){};
  void add_edge(int f, int t, int id)
  {
    G[f].push_back(edge(t, 1, (int)G[t].size(), id, 0));
    G[t].push_back(edge(f, 1, (int)G[f].size()-1, id, 1));
  }
  void bfs(int s)
  {
    fill(level.begin(), level.end(), -1);
    queue<int> que;
    level[s] = 0;
    que.push(s);
    while(!que.empty()) {
      int v = que.front(); que.pop();
      for(int i = 0; i < (int)G[v].size(); i++) {
	edge& e = G[v][i];
	if(e.cap > 0 && level[e.to] < 0) {
	  level[e.to] = level[v] + 1;
	  que.push(e.to);
	}
      }
    }
  }
  int dfs(int v, int t, int f)
  {
    if(v == t) return f;
    for(int &i = iter[v]; i < (int)G[v].size(); i++) {
      edge& e = G[v][i];
      if(e.cap > 0 && level[v] < level[e.to]) {
	int d = dfs(e.to, t, min(f, e.cap));
	if(d > 0) {
	  e.cap -= d;
	  G[e.to][e.rev].cap += d;
	  return d;
	}
      }
    }
    return 0;
  }
  int max_flow(int s, int t)
  {
    int flow = 0;
    while(1) {
      bfs(s);
      if(level[t] < 0) return flow;
      fill(iter.begin(), iter.end(), 0);
      int f; while((f = dfs(s, t, inf)) > 0) flow += f;
    }
  }
};

int main()
{
  int N, M; cin >> N >> M;
  Dinic dinic(N);
  for(int i = 0; i < M; i++) {
    int X, Y; cin >> X >> Y; X--, Y--;
    dinic.add_edge(X, Y, i);
  }
  int S, T; cin >> S >> T; S--, T--;
  int ans = dinic.max_flow(S, T);
  vector<int> used_rev;
  for(int v = 0; v < (int)dinic.G.size(); v++) {
    for(int i = 0; i < (int)dinic.G[v].size(); i++) {
      edge e = dinic.G[v][i];
      if(e.cap < 1 && e.isrev == 1) used_rev.push_back(e.id);
    }
  }
  sort(used_rev.begin(), used_rev.end());
  cout << ans << endl;
  cout << (int)used_rev.size() << endl;
  for(int i = 0; i < (int)used_rev.size(); i++) cout << used_rev[i]+1 << endl;
  return 0;
}