1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#define MAXN 100007
#define INF
#define PB push_back
#define MP make_pair
#define ST first
#define ND second

#define REP(i,n) for(int i=0;i<(n);i++)
#define FOR(a,b,c) for(int a=b;a<=(c);a++)
#define FORD(a,b,c) for (int a=b;a>=(c);a--)
#define VAR(v,n) __typeof(n) v=(n)
#define ALL(c) c.begin(),c.end()
#define FOREACH(i,c) for(VAR(i,(c).begin());i!=(c).end();i++)

using namespace std;

typedef long long LL;

int n;
int ile[2];
LL zycie,koszt,zysk;
pair<LL,pair<LL,int> > t[2][MAXN];  
bool mozna;

int main(){
	mozna = true;
	scanf("%d%lld",&n,&zycie);
	REP(i,n) {
		scanf("%lld%lld",&koszt,&zysk);
		if (koszt <= zysk) t[0][ile[0]++] = MP(koszt,MP(zysk,i));
			else t[1][ile[1]++] = MP(zysk,MP(koszt,i));
	}
	sort(t[0],t[0]+ile[0]);
	REP(i,ile[0]) {
		if (t[0][i].ST >= zycie) mozna = false;
		zycie += t[0][i].ND.ST - t[0][i].ST;
	}
	
	sort(t[1],t[1]+ile[1]);
	FORD(i,ile[1]-1,0) {
		if (t[1][i].ND.ST >= zycie) mozna = false;
		zycie += t[1][i].ST - t[1][i].ND.ST;
	}
	
	if (mozna) {
		puts("TAK");
		REP(i,ile[0]) printf("%d ",t[0][i].ND.ND+1);
		FORD(i,ile[1]-1,0) printf("%d ",t[1][i].ND.ND+1);
		puts("");
	}
	else puts("NIE");
	return 0;
}