#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define FOR(k,a,b) for(int k(a); k < (b); ++k) #define REP(k,a) for(int k=0; k < (a); ++k) #define ABS(a) ((a)>0?(a):-(a)) using namespace std; typedef long long LL; typedef unsigned int uint; typedef pair PII; typedef vector VI; typedef vector VD; typedef vector VPII; typedef vector VVPII; typedef vector VVI; typedef vector VVD; typedef vector VB; typedef vector VVB; long long readInt(long long l, long long r, char endd) { long long x = 0; int cnt = 0; int fi = -1; bool is_neg = false; while (true) { char g = getchar(); if (g == '-') { assert(fi == -1); is_neg = true; continue; } if ('0' <= g && g <= '9') { x *= 10; x += g - '0'; if (cnt == 0) { fi = g - '0'; } cnt++; assert(fi != 0 || cnt == 1); assert(fi != 0 || is_neg == false); assert(!(cnt>19 || (cnt == 19 && fi>1))); } else if (g == endd) { if (is_neg) { x = -x; } assert(l <= x && x <= r); return x; } else { assert(false); } } } string readString(int l, int r, char endd) { string ret = ""; int cnt = 0; while (true) { char g = getchar(); assert(g != -1); if (g == endd) { break; } cnt++; ret += g; } assert(l <= cnt && cnt <= r); return ret; } long long readIntSp(long long l, long long r) { return readInt(l, r, ' '); } long long readIntLn(long long l, long long r) { return readInt(l, r, '\n'); } string readStringLn(int l, int r) { return readString(l, r, '\n'); } string readStringSp(int l, int r) { return readString(l, r, ' '); } int main(int argc, char** argv) { #ifdef HOME freopen("in.txt", "rb", stdin); freopen("out.txt", "wb", stdout); #endif int N, ans = 0,u,v,w; //N = readIntLn(2, 1000); scanf("%d", &N); VI part(N), partS(N); REP(i,N) { part[i] = i; partS[i] = 1; } REP(ro,N-1) { int mi = -1; REP(i,N) {//find minimal size if (part[i] == i && (mi == -1 || partS[i] < partS[mi])) { mi = i; } } printf("1 %d %d\n", partS[mi], N - partS[mi]); REP(i,N) { if(part[i]==mi) { printf("%d ", i + 1); } } printf("\n"); REP(i, N) { if (part[i] != mi) { printf("%d ", i + 1); } } printf("\n"); fflush(stdout); scanf("%d %d %d", &u,&v,&w); //u = readIntSp(1, N); //v = readIntSp(1, N); //w = readIntLn(1, 100000); --u, --v; ans += w; u = part[u]; v = part[v]; assert(part[u] != part[v]); partS[u] += partS[v]; REP(i, N) if(part[i] == v) { part[i] = u; } } printf("2 %d\n", ans); fflush(stdout); //assert(getchar() == -1); return 0; }