#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<bitset>
#include<map>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
typedef long long LL;
typedef double db;
int get(){
char ch;
while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');
if (ch=='-'){
int s=0;
while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
return -s;
}
int s=ch-'0';
while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
return s;
}
const int N = 100005;
int n;
LL k;
LL lef[N],rig[N];
LL fl[N*2],fr[N*2];
struct node{
int v,l,r;
}tree[N*4];
int tot;
int h[N*2],m;
int getw(int v){
int l=1,r=m,ans=0;
while(l<=r){
int mid=(l+r)/2;
if (v<h[mid])r=mid-1;
else ans=mid,l=mid+1;
}
return ans;
}
void build(int &now,int l,int r){
now=++tot;
tree[now].v=1e+9;
if (l==r)return;
int mid=(l+r)/2;
build(tree[now].l,l,mid);
build(tree[now].r,mid+1,r);
}
void change(int now,int l,int r,int x,int y,int id){
if (x<=l&&r<=y){
tree[now].v=id;
return;
}
int mid=(l+r)/2;
if (x<=mid)change(tree[now].l,l,mid,x,y,id);
if (y>mid)change(tree[now].r,mid+1,r,x,y,id);
}
int getv(int now,int l,int r,int x){
if (l==r)return tree[now].v;
int mid=(l+r)/2;
if (x<=mid)return min(tree[now].v,getv(tree[now].l,l,mid,x));
return min(tree[now].v,getv(tree[now].r,mid+1,r,x));
}
LL minll(LL x,LL y){return x<y?x:y;}
int main(){
n=get();k=get();
LL sum=0,ans=0;
fo(i,1,n){
int a=get(),b=get();
if (a*2>k&&b==1)return printf("-1\n"),0;
ans+=a*2;
sum=(sum+a)%k;
if (b==2)lef[i]=0,rig[i]=k-1;
else rig[i]=(k-sum)%k*2%k,lef[i]=(k-sum+a+k)%k*2%k;
}
fo(i,1,n)h[++m]=lef[i],h[++m]=rig[i];
sort(h+1,h+1+m);
int m_=1;
fo(i,2,m)if (h[i]>h[i-1])h[++m_]=h[i];
m=m_;
int rt=0;tot=0;
build(rt,1,m);
fd(i,n,1){
int l=getw(lef[i]),r=getw(rig[i]);
int p=getv(1,1,m,l);
if (p<=n)fl[i]=fl[p]+(lef[p]+k-lef[i])%k;
p=getv(1,1,m,r);
if (p<=n)fr[i]=fl[p]+(lef[p]+k-rig[i])%k;
if (l<=r){
if (l>1)change(1,1,m,1,l-1,i);
if (r<m)change(1,1,m,r+1,m,i);
}
else if(r+1<l)change(1,1,m,r+1,l-1,i);
}
tot=0,rt=0;
build(rt,1,m);
LL fans=1e+14;
fo(i,1,n){
int l=getw(lef[i]),r=getw(rig[i]);
int p=getv(1,1,m,l);
if (p>n)fans=minll(fans,fl[i]);
p=getv(1,1,m,r);
if (p>n)fans=minll(fans,fr[i]);
if (l<=r){
if (l>1)change(1,1,m,1,l-1,i);
if (r<m)change(1,1,m,r+1,m,i);
}
else if(r+1<l)change(1,1,m,r+1,l-1,i);
}
fans=fans+ans;
printf("%lld\n",fans);
return 0;
}