#include<bits/stdc++.h>
using namespace std;

#define int long long

#define rep(i,n) for(int i=0;i<(n);i++)
#define pb push_back
#define all(v) (v).begin(),(v).end()
#define fi first
#define se second
typedef vector<int>vint;
typedef pair<int,int>pint;
typedef vector<pint>vpint;

template<typename A,typename B>inline void chmin(A &a,B b){if(a>b)a=b;}
template<typename A,typename B>inline void chmax(A &a,B b){if(a<b)a=b;}

const int INF=1001001001;
const int INFLL=1001001001001001001ll;
const int mod=1000000007;
inline void add(int &a,int b){
    a+=b;
    if(a>=mod)a-=mod;
}


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

    const int INF=1001001001;
    vector<vector<edge>>G;
    vector<int>level,iter;
    Dinic(int v):G(v),level(v),iter(v){}

    void addEdge(int from,int to,int id){
        G[from].push_back(edge(to,1,G[to].size(),id));
        G[to].push_back(edge(from,1,G[from].size()-1,id));
    }

    void bfs(int s){
        fill(level.begin(),level.end(),-1);
        queue<int>que;
        level[s]=0;
        que.push(s);
        while(que.size()){
            int v=que.front();
            que.pop();
            for(auto &e:G[v]){
                if(e.cap&&level[e.to]==-1){
                    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<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 maxFlow(int s,int t){
        int flow=0;
        while(true){
            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;
        }
    }
};

signed main(){
    int N,M;
    cin>>N>>M;

    Dinic d(N);
    vint A(M),B(M);
    rep(i,M){
        int a,b;
        cin>>a>>b;
        a--;b--;
        d.addEdge(a,b,i);
        A[i]=a;B[i]=b;
    }


    int src,snk;
    cin>>src>>snk;
    src--;snk--;

    int tmp=d.maxFlow(src,snk);
    vint lis;
    rep(i,N){
        for(auto &e:d.G[i]){
            if(e.cap==0&&A[e.id]!=i){
                lis.pb(e.id);
            }
        }
    }

    printf("%lld\n",tmp);
    printf("%lld\n",(int)lis.size());
    rep(i,lis.size())printf("%lld\n",lis[i]+1);
    return 0;
}