Example

Input

3 3 1 2 4
1 2
2 3
3 1


Output

IMPOSSIBLE
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,a,b,c;
vector<int> G[55];
int dp[55][55][111];
void dfs(int r,int v,int d){
  if(dp[r][v][d]) return;
  dp[r][v][d]=1;
  if(d>100) return;
  for(int u:G[v]){
    dfs(r,u,d+1);
  }
}
signed main(){
  cin>>n>>m>>a>>b>>c;
  for(int i=0;i<m;i++){
    int u,v;
    cin>>u>>v;
    u--;v--;
    G[u].push_back(v);
  }
  memset(dp,0,sizeof(dp));
  for(int i=0;i<n;i++){
    dfs(i,i,0);
  }
  int dp2[n];
  memset(dp2,-1,sizeof(dp2));
  dp2[n-1]=0;
  while(1){
    bool flg=0;
    for(int v=0;v<n;v++){
      int x=-1,y=-1,z=-1;
      for(int i=0;i<n;i++){
	if(dp2[i]<0) continue;
	if(dp[v][i][a]) if(x<0||x>dp2[i]) x=dp2[i];
	if(dp[v][i][b]) if(y<0||y>dp2[i]) y=dp2[i];
	if(dp[v][i][c]) if(z<0||z>dp2[i]) z=dp2[i];
      }
      if(x<0||y<0||z<0) continue;
      int nd=max(x,max(y,z))+1;
      if(dp2[v]<0||dp2[v]>nd){
	dp2[v]=nd;
	flg=1;
	break;
      }
    }
    if(!flg) break;
  }
  if(dp2[0]<0) cout<<"IMPOSSIBLE"<<endl;
  else cout<<dp2[0]<<endl;
  return 0;
}