#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

struct edge{
	int to,cap,rev;
	edge(){}
	edge(int tt,int cc,int rr){
		to=tt;
		cap=cc;
		rev=rr;
	}
};

class dinic{
public:
	const int INF=100000;
	vector<edge> G[2001];
	int level[2001];
	int iter[2001];
	void add_edge(int from,int to,int cap){
		G[from].push_back(edge(to,cap,G[to].size()));
		G[to].push_back(edge(from,0,G[from].size()-1));
	}

	void bfs(int s){
		memset(level,-1,sizeof(level));
		queue<int> que;
		level[s]=0;
		que.push(s);
		while(que.size()){
			int v=que.front();
			que.pop();
			for(int i=0;i<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<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(e.cap,f));
				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;
			memset(iter,0,sizeof(iter));
			int f;
			while((f=dfs(s,t,INF))>0){
				flow+=f;
			}
		}
	}
};

int n,m,s,t;
dinic di;
int a[10001],b[10001];
bool ok[2][2001];

void dfs(int v,int t){
	ok[t][v]=true;
	for(int i=0;i<di.G[v].size();i++){
		edge e=di.G[v][i];
		if(!ok[t][e.to]){
			if((t==1 && e.cap>0)){
				dfs(e.to,t);
			}
			if(t==0 && (v==(n+1) || e.cap==0)){
				dfs(e.to,t);
			}
		}
	}
}

void solve(){
	int S=n,T=n+1;
	for(int i=0;i<=T;i++){
		di.G[i].clear();
	}
	s--;
	t--;
	di.add_edge(S,s,114514);
	di.add_edge(t,T,114514);
	for(int i=0;i<m;i++){
		scanf("%d%d",&a[i],&b[i]);
		a[i]--;
		b[i]--;
		di.add_edge(a[i],b[i],1);
	}
	int val=di.max_flow(S,T);
	memset(ok,false,sizeof(ok));
	dfs(S,1);
	dfs(T,0);
	bool flag=false;
	int cnt=0;
	for(int i=0;i<m;i++){
		if(ok[1][b[i]] && ok[0][a[i]]){
			cnt++;
		}
	}
	if(cnt>0)val++;
	printf("%d %d\n",val,cnt);
}

int main(void){
	while(1){
		scanf("%d%d%d%d",&n,&m,&s,&t);
		if(n==0 && m==0)break;
		solve();
	}
	return 0;
}
