# include <cmath>
# include <algorithm>
# include <iostream>
# include <cstring>
# define bignum 200000000
# define eps 1e-6
# define N 655
using namespace std;
int p;
struct Point
{
	int x,y;
}pt[N],pln[N];

int dlcmp(int x)
{
	return x<0?-1:x>0;
}
int cross(Point a,Point b,Point s)
{
	int x1=a.x-s.x,y1=a.y-s.y;
	int x2=b.x-s.x,y2=b.y-s.y;
	return x1*y2-x2*y1;
}
double dis(Point a,Point b)
{
	double dx=a.x-b.x;
	double dy=a.y-b.y;
	return sqrt( dx*dx + dy*dy );
}
int cmp(Point a,Point b)
{
	if (dlcmp(cross(a,b,pt[0]))==1 || 
		(dlcmp(cross(a,b,pt[0]))==0 && dis(pt[0],a)<dis(pt[0],b)) )
		return 1;
	else return 0;
}
int graham_scan(int n)
{
	int top,t,i;
	if (n<=1)
		return n;
	for (t=0,i=1;i<n;i++)
		if (dlcmp(pt[i].y-pt[t].y)==-1 || 
		(dlcmp(pt[i].y-pt[t].y)==0 && dlcmp(pt[i].x-pt[t].x)==-1))
				t=i;
	swap(pt[0],pt[t]);

	sort (pt+1,pt+n,cmp);
	for (i=0;i<2;i++)
		pln[i]=pt[i];
	top=2;
	for (i=2;i<n;i++)
	{
		while (top>1 && dlcmp(cross(pln[top-1],pt[i],pln[top-2]))<=0)
			top--;
		pln[top++]=pt[i];
	}
	return top;
}
int abss(int x)
{
	return x<0?-x:x;
}
inline int calc(int x,int y)
{
	return (abss(pt[x].x+pt[y].x)*abss(pt[x].y+pt[y].y))%p;
}
int dp[N][N];
int main (void)
{
	int n;
	while (cin>>n>>p)
	{
		for (int i=0;i<n;i++)
			cin>>pt[i].x>>pt[i].y;
		if (graham_scan(n)<n)
		{
			cout<<"I can't cut."<<endl;
			continue;
		}
		for (int i=n;i<n+n;i++)
			pt[i]=pt[i-n];
		memset(dp,0,sizeof(dp));
		for (int len=3;len<n;len++)
		{
			for (int i=0;i<n;i++)
			{
				int j=i+len;
				dp[i][j]=min(dp[i+1][j]+calc(i+1,j),dp[i][j-1]+calc(i,j-1));
				for (int k=i+2;k<=j-2;k++)
					dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+calc(i,k)+calc(j,k));
			}
		}
		int ans=bignum;
		for (int i=0;i<n;i++)
			ans=min(ans,dp[i][i+n-1]);
		cout<<ans<<endl;
	}
	
	return 0;
}