#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>

using namespace std;

int n, m;
vector<int> sol;

int ask(int x, int y)
{
    printf("1 %d %d\n", x, y);
    fflush(stdout);

    int ans;
    scanf("%d", &ans);
    return ans;
}

int main()
{
    scanf("%d", &n);
    int crb=1;

    while(crb<=n)
    {
        int pz=0;
        if(crb==n)
        {
            sol.push_back(crb);
            break;
        }
        while(ask(crb, crb+(1<<pz))==1)
        {
            ++pz;
            if(crb+(1<<pz)>n)
                break;
        }

        if(pz==0)
        {
            sol.push_back(crb);
            ++crb;
            continue;
        }

        --pz;

        int left=crb+(1<<pz)+1, right=min(n, crb+(1<<(pz+1))), med, sl=crb+(1<<pz);

        while(left<=right)
        {
            int med=(left+right)/2;
            if(ask(crb, med)==1)
            {
                sl=med;
                left=med+1;
            }
            else
                right=med-1;
        }

        sol.push_back(crb);
        crb=sl+1;
    }

    printf("2 %d ", sol.size());

    for(int i=0; i<sol.size(); ++i)
        printf("%d ", sol[i]);
    printf("\n");

    fflush(stdout);

    return 0;
}