#include <iostream>
#include <vector>
using namespace std;
int Connected(int lvl, int a, int b){
cout<<"? "<<lvl<<' '<<a<<' '<<b<<endl;
int ans; cin>>ans;
return ans;
}
int lastLevel = 0;
vector<int> rep;
struct segTree{
int l; int r;
int leader;
segTree * lc, * rc;
int level;
segTree(int ind){
leader = rep[ind];
l = r = ind;
level = 0;
lc = rc = nullptr;
}
segTree(segTree*le, segTree*ri){
lc = le;
rc = ri;
l = lc->l;
r = rc->r;
leader = lc->leader;
level = Connected(lc->level, lc->leader, rc->leader);
lastLevel = level;
}
};
segTree * build(int l, int r){
int mid = (l+r)/2;
if(l==r) return new segTree(l);
else return new segTree(build(l, mid), build(mid+1, r));
}
int query(segTree * st, int nd){
if(st->l == st->r) return st->leader;
if(st->lc->level == Connected(st->lc->level, nd, st->lc->leader)) return query(st->lc, nd);
else return query(st->rc, nd);
}
void ToyDesign(int n, int max_ops){
rep.clear();
rep.push_back(1);
for(int i = 2; i<=n; i++){
int b = Connected(lastLevel, 1, i);
if(b>lastLevel) rep.push_back(i);
lastLevel = b;
}
segTree * seg = build(0, rep.size()-1);
vector<pair<int, int>> ans;
int repind = 0;
for(int i = 1; i<=n; i++){
if(i == rep[repind]){
repind++;
continue;
}
ans.push_back({i, query(seg, i)});
}
cout<<"! "<<ans.size()<<endl;
for(auto i : ans) cout<<i.first<<' '<<i.second<<endl;
}
int main(void){
int n, maxq;
cin>>n>>maxq;
ToyDesign(n, maxq);
return 0;
}