Example

Input

3 3 1 2 4
1 2
2 3
3 1


Output

IMPOSSIBLE
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,m,a[3];
bool edge[50][50];
int dist[50];
vector<int>d[50][101];
int main()
{
	cin>>n>>m;
	for(int i=0;i<3;i++)cin>>a[i];
	for(int i=0;i<m;i++)
	{
		int u,v;cin>>u>>v;
		u--,v--;
		edge[u][v]=1;
	}
	for(int i=0;i<n;i++)dist[i]=1e9,d[i][0].push_back(i);
	dist[n-1]=0;
	for(int i=0;i<100;i++)for(int j=0;j<n;j++)
	{
		for(int k=0;k<n;k++)if(edge[j][k])for(int l=0;l<d[k][i].size();l++)
			d[j][i+1].push_back(d[k][i][l]);
		sort(d[j][i+1].begin(),d[j][i+1].end());
		d[j][i+1].erase(unique(d[j][i+1].begin(),d[j][i+1].end()),d[j][i+1].end());
	}
	for(;;)
	{
		bool flag=0;
		for(int i=0;i<n;i++)
		{
			int ans=0;
			for(int j=0;j<3;j++)
			{
				int now=1e9;
				for(int k=0;k<d[i][a[j]].size();k++)
				{
					now=min(now,dist[d[i][a[j]][k]]+1);
				}
				ans=max(ans,now);
			}
			if(dist[i]>ans)
			{
				dist[i]=ans;
				flag=1;
			}
		}
		if(!flag)break;
	}
	if(dist[0]<1e9)cout<<dist[0]<<endl;
	else cout<<"IMPOSSIBLE"<<endl;
}
