intask( ll k ) { cout << "? " << k << endl; int len = 0; cin >> len; if( len == 0 ) return0; for( int i = 0; i < len; ++ i ) cin >> cache[i]; return len; }
ll dfs( int u, ll rnk, int dep ) { if( dp[u] != -1 ) return dp[u]; ll cnt = 1; while( 1 ) { int len = ask( rnk + cnt ); if( len <= dep || cache[dep] != u ) break; int v = cache[dep + 1]; edges[m ++] = { u, v }; cnt += dfs( v, rnk + cnt, dep + 1 ); } return dp[u] = cnt; }
voidsolve( ) { cin >> n; memset( dp, -1, sizeof( dp ) ); m = 0; ll rnk = 1; for( int i = 1; i <= n; ++ i ) { if( dp[i] == -1 ) dfs( i, rnk, 0 ); rnk += dp[i]; }
cout << "! " << m << endl; for( int i = 0; i < m; ++ i ) cout << edges[i].u << " " << edges[i].v << endl; }