#include <cstdio>   #include <cstring>   #include <iostream>   #include <vector>   #include <cmath>   #include <cstdlib>   #include <ctime>   #include <algorithm>   #include <string>   #include <map>   #define ll long long   #define ls id << 1   #define rs id << 1 | 1   #define mem(array, value, size, type) memset(array, value, ((size) + 5) * sizeof(type))   #define memarray(array, value) memset(array, value, sizeof(array))   #define fillarray(array, value, begin, end) fill((array) + (begin), (array) + (end) + 1, value)   #define fillvector(v, value) fill((v).begin(), (v).end(), value)   #define pb(x) push_back(x)   #define st(x) (1LL << (x))   #define pii pair<int, int>   #define mp(a, b) make_pair((a), (b))   #define Flush fflush(stdout)   #define vecfirst (*vec.begin())   #define veclast (*vec.rbegin())   #define vecall(v) (v).begin(), (v).end()   #define vecupsort(v) (sort((v).begin(), (v).end()))   #define vecdownsort(v, type) (sort(vecall(v), greater<type>()))   #define veccmpsort(v, cmp) (sort(vecall(v), cmp))   using namespace std;   const int N = 500050;   const int inf = 0x3f3f3f3f;   const ll llinf = 0x3f3f3f3f3f3f3f3f;   const int mod = 998244353;   const int MOD = 1e9 + 7;   const double PI = acos(-1.0);   clock_t TIME__START, TIME__END;   void program_end()   {   #ifdef ONLINE       printf(  n nTime used: %.6lf(s) n , ((double)TIME__END - TIME__START) / 1000);       system( pause );   #endif   }   int n;   int ask1(int x, int y)   {       printf( 1 %d %d n , x, y), Flush;       int ret;       scanf( %d , &ret);       return ret;   }   int ask2(int x, const vector<int> &vec)   {       printf( 2 %d %d , x, (int)vec.size());       for (auto i : vec)           printf(  %d , i);       putchar(  n ), Flush;       int ret;       scanf( %d , &ret);       return ret;   }   int ans[105][105];   vector<int> e;      vector<int> mergesort(int l, int r)   {       vector<int> ret;       if (l == r)       {           ret.push_back(l);           return ret;       }       int mid = (l + r) >> 1;       auto vl = mergesort(l, mid);       auto vr = mergesort(mid + 1, r);       int i = 0, j = 0;       while (i < (int)vl.size() && j < (int)vr.size())       {           int r = ask1(vl[i], vr[j]);           if (r == 1)           {               ret.push_back(vl[i]);               i++;           }           else           {               ret.push_back(vr[j]);               j++;           }       }       while (i < (int)vl.size())           ret.push_back(vl[i]), i++;       while (j < (int)vr.size())           ret.push_back(vr[j]), j++;       return ret;   }      void work1()   {       e.clear();       e = mergesort(0, n - 1);       for (int i = 0; i < (int)e.size(); ++i)           for (int j = i; j < (int)e.size(); ++j)               ans[e[i]][e[j]] = 1;   }      inline void solve()   {       memarray(ans, 0);       scanf( %d , &n);       work1();       int u = n - 1, p = n - 2;   #ifdef VINGYING       printf( Hamiton:  );       for (auto i : e)           cout << i <<    ;       putchar(  n );   #endif       while (u >= 0 && p >= 0)       {           vector<int> v;           for (int i = 0; i <= p; ++i)               v.push_back(e[i]);           int r = ask2(e[u], v);           if (r == 1)               p--;           if (p < 0)           {               ans[e[u]][e[0]]=1;               break;           }           if (r == 0)           {               ans[e[u]][e[p+1]]=1;               u--;               if (p==u)p--;               if (p < 0)            {                ans[e[u]][e[0]]=1;                break;            }           }       }       for(int k=0;k<n;k++)        for(int i=0;i<n;i++)         for(int j=0;j<n;j++)          ans[i][j]=(ans[i][j]||(ans[i][k]&&ans[k][j]));       printf( 3 n );       for (int i = 0; i < n; ++i, putchar(  n ))           for (int j = 0; j < n; ++j)               printf( %d , ans[i][j]);       Flush;       int resp;       scanf( %d ,&resp);       if(resp==-1)exit(0);   }      int main()   {       TIME__START = clock();       int Test = 1;       scanf( %d , &Test);       while (Test--)       {           solve();           // if (Test)           //     putchar(  n );       }       TIME__END = clock();       program_end();       return 0;   }