#include <stdio.h>
#include <vector>
#include <algorithm>
#define x first
#define y second
const int nm = 1 << 16;
using namespace std;
int d[nm], n, t, conf, sz, m[nm], prev[nm];
long long r[16], p[16], D;
vector<int> v, sol;
void bkt(int, long long, long long);
int calculeaza(int);
pair<long long, long long> gcd_e(long long, long long);
int main()
{
freopen("vanatoare.in", "r", stdin);
freopen("vanatoare.out", "w", stdout);
scanf("%d %d", &n, &t);
for(int i = 0; i < n; ++i)
{
scanf("%d %d", &r[i], &p[i]);
}
bkt(0, 0 , 1);
sz = v.size();
/*
for(int i = 0; i < sz; ++i)
{
printf("%d\n", v[i]);
}
*/
(void)calculeaza((1 << n) - 1);
printf("%d\n", d[(1 << n) - 1]);
conf = (1 << n) - 1;
while(prev[conf] ^ conf)
{
sol.push_back(m[conf ^ prev[conf]]);
conf = prev[conf];
}
sort(sol.begin(), sol.end());
for(int i = 0; i < sol.size(); ++i)
{
printf("%d ", sol[i]);
}
printf("\n");
return 0;
}
void bkt(int k, long long rest, long long div)
{
if(k < n)
{
pair<long long, long long> temp;
long long new_val, new_div;
bkt(k + 1 , rest, div);
temp = gcd_e(div, p[k]);
new_val = temp.x * (div / D) * (r[k] - rest) + rest;
new_div = div / D * p[k];
new_val %= new_div;
if(new_val < 0)
{
new_val += new_div;
}
//printf("%d %lld %lld\n", k, temp.x, new_val);
if(new_val % div == rest && new_val % p[k] == r[k])
{
rest = new_val;
div = new_div;
if(rest <= t)
{
conf |= (1 << k);
d[conf] = 1;
v.push_back(conf);
m[conf] = rest;
bkt(k + 1, rest, div);
conf ^= (1 << k);
}
}
}
}
pair<long long, long long> gcd_e(long long a,long long b)
{
if(b == 0)
{
D = a;
return make_pair(1, 0);
}
else
{
pair<long long, long long> temp = gcd_e(b, a % b);
return make_pair(temp.y, temp.x - a / b * temp.y);
}
}
int calculeaza(int config)
{
int i, min = n;
int temp;
if(d[config])
return d[config];
for(i = 0; i < sz; ++i)
{
if((config & v[i]) == v[i])
{
temp = calculeaza(config ^ v[i]);
if(min > temp + 1)
{
min = temp + 1;
prev[config] = (conf ^ v[i]);
}
}
}
d[config] = min;
return d[config];
}