#include <bits/stdc++.h>
using namespace std;
int n,t;
struct cow
{
int s,e;
friend bool operator<(cow a,cow b)
{
return a.e < b.e;
}
}a[25010];
int tree[4000010];
void pushup(int u)
{
tree[u] = min(tree[u * 2],tree[u * 2 + 1]);
}
void build(int u,int l,int r)
{
if (l == r)
{
tree[u] = 0x3f3f3f3f;
return;
}
int mid = (l + r) / 2;
build(u * 2,l,mid);
build(u * 2 + 1,mid + 1,r);
pushup(u);
}
bool InRange(int L,int R,int l,int r)
{
return (L >= l) && (R <= r);
}
bool OutOfRange(int L,int R,int l,int r)
{
return (L > r) || (R < l);
}
int query(int u,int nl,int nr,int l,int r)
{
if (InRange(nl,nr,l,r))
{
return tree[u];
}
else if (!OutOfRange(nl,nr,l,r))
{
int nmid = (nl + nr) / 2;
return min(query(u * 2,nl,nmid,l,r),query(u * 2 +1,nmid + 1,nr,l,r));
}
else return 0x3f3f3f3f;
}
void update(int u,int nl,int nr,int p,int x)
{
if (nl == nr)
{
tree[u] = x;
return;
}
else
{
int nmid = (nl + nr) / 2;
if (nmid >= p)
{
update(u * 2,nl,nmid,p,x);
}
else
{
update(u * 2 + 1,nmid + 1,nr,p,x);
}
pushup(u);
}
}
signed main()
{
cin >> n >> t;
for (int i = 1;i <= n;i++)
{
cin >> a[i].s >> a[i].e;
if (a[i].s == 1) update(1,1,t,a[i].e,1);
}
sort(a + 1,a + n + 1);
build(1,1,t);
for (int i = 1;i <= n;i++)
{
int s = a[i].s,e = a[i].e,num = min(query(1,1,t,e,e),query(1,1,t,s -1,e - 1) + 1);
update(1,1,t,e,num);
}
if (query(1,1,t,t,t) == 0x3f3f3f3f) cout << -1;
else cout << query(1,1,t,t,t);
return 0;
}