/* template.cpp {{{ */
#include <bits/stdc++.h>
using namespace std;
#define get_macro(a, b, c, d, name, ...) name
#define rep(...) get_macro(__VA_ARGS__, rep4, rep3, rep2, rep1)(__VA_ARGS__)
#define rrep(...) get_macro(__VA_ARGS__, rrep4, rrep3, rrep2, rrep1)(__VA_ARGS__)
#define rep1(n) rep2(i_, n)
#define rep2(i, n) rep3(i, 0, n)
#define rep3(i, a, b) rep4(i, a, b, 1)
#define rep4(i, a, b, s) for (ll i = (a); i < (ll)(b); i += (ll)(s))
#define rrep1(n) rrep2(i_, n)
#define rrep2(i, n) rrep3(i, 0, n)
#define rrep3(i, a, b) rrep4(i, a, b, 1)
#define rrep4(i, a, b, s) for (ll i = (ll)(b) - 1; i >= (ll)(a); i -= (ll)(s))
#define each(x, c) for (auto &&x : c)
#define fs first
#define sc second
#define all(c) begin(c), end(c)
using ui = unsigned;
using ll = long long;
using ul = unsigned long long;
using ld = long double;
const int inf = 1e9 + 10;
const ll inf_ll = 1e18 + 10;
const ll mod = 1e9 + 7;
const ll mod9 = 1e9 + 9;
const int dx[]{-1, 0, 1, 0, -1, 1, 1, -1};
const int dy[]{0, -1, 0, 1, -1, -1, 1, 1};
template<class T, class U> void chmin(T &x, const U &y){ x = min<T>(x, y); }
template<class T, class U> void chmax(T &x, const U &y){ x = max<T>(x, y); }
struct prepare_ { prepare_(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(12); } } prepare__;
/* }}} */

int n, m;

struct Edge {
  int dst, cap;
  Edge *rev;
  Edge(): dst(0), cap(0), rev(nullptr){}
  Edge(int dst, int cap, Edge *rev): dst(dst), cap(cap), rev(rev){}
};

vector<Edge> g[300];

void addEdge(int src, int dst){
  g[src].emplace_back(dst, 1, nullptr);
  g[dst].emplace_back(src, 0, nullptr);
  g[src].back().rev = &g[dst].back();
  g[dst].back().rev = &g[src].back();

  g[dst].emplace_back(src, 1, nullptr);
  g[src].emplace_back(dst, 0, nullptr);
  g[dst].back().rev = &g[src].back();
  g[src].back().rev = &g[dst].back();
}

bool used[300];

int dfs(int v, int t, int f){
  if (v == t) return f;
  used[v] = true;
  each(e, g[v]){
    if (!used[e.dst] && e.cap > 0){
      int d = dfs(e.dst, t, min(f, e.cap));
      if (d > 0){
        e.cap -= d;
        e.rev->cap += d;
        return d;
      }
    }
  }
  return 0;
}

int maxFlow(int s, int t){
  int flow = 0;
  while (true){
    memset(used, 0, sizeof(used));
    int f = dfs(s, t, inf);
    if (f == 0) return flow;
    flow += f;
  }
}

Edge *tar[1000];

int main(){
  cin >> n >> m;
  rep(i, n) g[i].reserve(m * 2);
  rep(i, m){
    int s, t;
    cin >> s >> t, s--, t--;
    addEdge(s, t);
    tar[i] = &g[t].back();
  }
  int s, t;
  cin >> s >> t, s--, t--;
  cout << maxFlow(s, t) << endl;
  vector<int> res;
  rep(i, m){
    if (tar[i]->cap == 0){// 逆向きの辺が使われている
      res.push_back(i + 1);
    }
  }
  cout << res.size() << endl;
  each(x, res) cout << x << endl;
}