#include<bits/stdc++.h>
using namespace std;
const long long maxn=1e7+5;
const long long inf=0x3f3f3f3f;
const long long mod=1e9+7;
long long n,m,a[maxn],b[maxn],cx[maxn],cy[maxn],px[maxn],py[maxn];
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	cin>>n>>m;
	memset(px,-1,sizeof(px));
	memset(py,-1,sizeof(py));
	for(long long i=1;i<=n;i++)
	{
		cin>>a[i];
		cx[a[i]]++;
		px[a[i]]=i;
	}
	for(long long i=1;i<=m;i++)
	{
		cin>>b[i];
		cy[b[i]]++;
		py[b[i]]=i;
	}
	for(long long i=1;i<=n*m;i++)
	{
		if(cx[i]>2||cy[i]>2)
		{
			cout<<"0"<<endl;
			return 0;
		}
	}
	long long nn=0,mm=0,ans=1,cnt=0;
	for(long long i=n;i>0;i--)
	{
		for(long long j=m;j>0;j--)
		{
			long long x=(i-1)*m+j;
			if(px[x]!=-1&&py[x]!=-1)
			{
				nn++;
				mm++;
				cnt++;
			}
			else if(px[x]!=-1)
			{
				if(!mm)
				{
					cout<<"0"<<endl;
					return 0;
				}
				nn++;
				cnt++;
				ans=ans*mm%mod;
			}
			else if(py[x]!=-1)
			{
				if(!nn)
				{
					cout<<"0"<<endl;
					return 0;
				}
				mm++;
				cnt++;
				ans=ans*nn%mod;
			}
			else
			{
				if(nn*mm-cnt==0)
				{
					cout<<"0"<<endl;
					return 0;
				}
				ans=ans*(nn*mm-cnt)%mod;
				cnt++;
			}
			if(mm>m||nn>n)
			{
				cout<<"0"<<endl;
				return 0;
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

/*
2 2
4 3
3 4
*/

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define _overload3(_1,_2,_3,name,...) name
#define _rep(i,n) repi(i,0,n)
#define repi(i,a,b) for(int i=int(a);i<int(b);++i)
#define rep(...) _overload3(__VA_ARGS__,repi,_rep,)(__VA_ARGS__)
#define VIEW(x) do {cerr << #x << ": "; for(auto i : x) cerr << i << " "; cerr << endl;} while(0)
#define ALL(x) (x).begin(),(x).end()
template<class T>bool umax(T &a, const T &b) {if(a<b){a=b;return 1;}return 0;}
template<class T>bool umin(T &a, const T &b) {if(b<a){a=b;return 1;}return 0;}

template<typename A,size_t N,typename T> void FILL(A (&array)[N],const T &val){fill((T*)array,(T*)(array+N),val);}
template<typename T> void FILL(vector<T> &v, const T &x) {fill(v.begin(), v.end(), x);}
template<typename T> void FILL(vector<vector<T>> &v, const T &x) {for(auto &i:v)fill(i.begin(), i.end(), x);}

int main() {
  int n,k; cin >> n >> k;
  vector<int> a(n);
  rep(i,n) cin >> a[i];
  
  int mx = 0, g = a[0];
  rep(i,n) {
    umax(mx, a[i]);
    g = gcd(g, a[i]); 
  }

  if(mx < k || k % g) puts("IMPOSSIBLE");
  else puts("POSSIBLE");
}
