#include<bits/stdc++.h>
// #include "toydesign.h"
using namespace std ;
#define F first
#define S second
const int N = 205 ;
const int Q = 20005 ;
int n , arr[N] ;
vector<pair<int,int>> edges ;
vector<int> v ;
int Connected(int a, int i, int j);
void DescribeDesign(std::vector<std::pair<int, int>> result);
void ToyDesign(int n, int max_ops){
arr[0] = 1 ; v.push_back(0) ;
for(int i=2 ; i<=n ; i++){
int le = -1 , ri = v.size()-1 , last ;
while(le<ri){
int mi = (le+ri)/2+1-(le==-1 && ri==0) , k = Connected(v[mi],1,i) ;
if(k==v[mi]) ri = mi-1 ;
else le = mi ;
}
if(le!=v.size()-1) edges.push_back({i,arr[le+1]}) ;
else v.push_back(Connected(v[le],1,i)) , arr[v.size()-1] = i ;
}
DescribeDesign(edges) ;
}
int Connected(int a , int i , int j){
cout << "? " << a << ' ' << i << ' ' << j << endl ;
int k ; cin >> k ; return k ;
}
void DescribeDesign(vector<pair<int,int>> result){
cout << "! " << (int)result.size() << endl ;
for(auto it:result) cout << it.F << ' ' << it.S << endl ;
}
int main(){
cin >> n ;
ToyDesign(n,n) ;
return 0 ;
}