#include <bits/stdc++.h>
using namespace std;
const int N = 200;
int n, par[N], sz[N], q = 0, a = 0, b = 0;
int find(int v) {
return par[v] == v ? v : (par[v] = find(par[v]));
}
bool merge(int u, int v) {
u = find(u), v = find(v);
if(u == v) return 0;
par[v] = u;
sz[u] += sz[v];
return 1;
}
bool found(int p, int l, int x) {
vector<int> ask(n + 1);
ask[p] = 1;
int edges = 0;
for(int i = l + 1; i <= x; i++) {
if(find(i) != find(p)) {
ask[i] = 2;
edges++;
}
}
q++;
if(q > 2000) assert(0);
cout << "? ";
for(int i = 1; i <= n; i++) {
cout << ask[i] << " ";
}
cout << endl;
int z;
cin >> z;
return z < b * edges;
}
int main() {
cin.tie(0); ios_base::sync_with_stdio(0);
cin >> n;
for(int i = 1; i <= n; i++) par[i] = i, sz[i] = 1;
cout << "? 1 2 ";
for(int i = 3; i <= n; i++) cout << "0 ";
cout << endl;
cin >> a;
for(int i = 1; i <= n && b == 0; i++) {
cout << "? ";
for(int j = 1; j <= n; j++) {
if(i != j) cout << 2 << " ";
else cout << 1 << " ";
}
cout << endl;
int z;
cin >> z;
if(a * (n - 1) != z) {
for(int j = 1; j <= n; j++) {
if(i == j) continue;
vector<int> ask(n + 1);
ask[i] = 1;
ask[j] = 2;
cout << "? ";
for(int i = 1; i <= n; i++) {
cout << ask[i] << " ";
}
cout << endl;
int y;
cin >> y;
if(y != a) {
b = y;
break;
}
}
if(a > b) swap(a, b);
}
}
if(b == 0) {
cout << "! " << n - 1 << '\n';
for(int i = 2; i <= n; i++) {
cout << 1 << " " << i << '\n';
}
cout << flush;
return 0;
}
// cout << a << " " << b << endl;
int ones = 0;
vector<pair<int,int>> edges;
for(int i = 1; i <= n && ones < n - 1; i++) {
int z = i;
while(1) {
int l = z + 1, r = n, x = -1;
while(l <= r) {
int mid = (l + r) / 2;
if(found(i, z, mid)) {
r = mid - 1, x = mid;
} else {
l = mid + 1;
}
}
z = x;
ones += x != -1;
if(x == -1) break;
edges.push_back({i, x});
merge(i, x);
if(ones == n - 1) break;
}
}
cout << "! " << n - 1 << '\n';
set<int> parents;
for(int i = 1; i <= n; i++) {
parents.insert(find(i));
}
for(int i = 1; i <= n && edges.size() < n - 1; i++) {
if(merge(find(i), *parents.begin())) {
edges.push_back({*parents.begin(), find(i)});
assert(*parents.begin() < find(i));
}
}
assert(edges.size() == n - 1);
for(auto [u, v] : edges) {
if(u > v) cout << v << " " << u << '\n';
else cout << u << " " << v << '\n';
}
cout << flush;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgTiA9IDIwMDsKCmludCBuLCBwYXJbTl0sIHN6W05dLCBxID0gMCwgYSA9IDAsIGIgPSAwOwoKaW50IGZpbmQoaW50IHYpIHsKCXJldHVybiBwYXJbdl0gPT0gdiA/IHYgOiAocGFyW3ZdID0gZmluZChwYXJbdl0pKTsKfQoKYm9vbCBtZXJnZShpbnQgdSwgaW50IHYpIHsKCXUgPSBmaW5kKHUpLCB2ID0gZmluZCh2KTsKCWlmKHUgPT0gdikgcmV0dXJuIDA7CgoJcGFyW3ZdID0gdTsKCXN6W3VdICs9IHN6W3ZdOwoJcmV0dXJuIDE7Cn0KCmJvb2wgZm91bmQoaW50IHAsIGludCBsLCBpbnQgeCkgewoJdmVjdG9yPGludD4gYXNrKG4gKyAxKTsKCWFza1twXSA9IDE7CglpbnQgZWRnZXMgPSAwOwoJZm9yKGludCBpID0gbCArIDE7IGkgPD0geDsgaSsrKSB7CgkJaWYoZmluZChpKSAhPSBmaW5kKHApKSB7CgkJCWFza1tpXSA9IDI7CgkJCWVkZ2VzKys7CgkJfQoJfQoJcSsrOwoJaWYocSA+IDIwMDApIGFzc2VydCgwKTsKCWNvdXQgPDwgIj8gIjsKCWZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJY291dCA8PCBhc2tbaV0gPDwgIiAiOwoJfQoJY291dCA8PCBlbmRsOwoKCWludCB6OwoJY2luID4+IHo7CglyZXR1cm4geiA8IGIgKiBlZGdlczsKfQkKCmludCBtYWluKCkgewoJY2luLnRpZSgwKTsgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsKCgljaW4gPj4gbjsKCglmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgcGFyW2ldID0gaSwgc3pbaV0gPSAxOwoKCWNvdXQgPDwgIj8gMSAyICI7Cglmb3IoaW50IGkgPSAzOyBpIDw9IG47IGkrKykgY291dCA8PCAiMCAiOwoJY291dCA8PCBlbmRsOwoKCWNpbiA+PiBhOyAKCglmb3IoaW50IGkgPSAxOyBpIDw9IG4gJiYgYiA9PSAwOyBpKyspIHsKCQljb3V0IDw8ICI/ICI7CgkJZm9yKGludCBqID0gMTsgaiA8PSBuOyBqKyspIHsKCQkJaWYoaSAhPSBqKSBjb3V0IDw8IDIgPDwgIiAiOwoJCQllbHNlIGNvdXQgPDwgMSA8PCAiICI7CgkJfQoJCWNvdXQgPDwgZW5kbDsKCgkJaW50IHo7CgkJY2luID4+IHo7CgoJCWlmKGEgKiAobiAtIDEpICE9IHopIHsKCQkJZm9yKGludCBqID0gMTsgaiA8PSBuOyBqKyspIHsKCQkJCWlmKGkgPT0gaikgY29udGludWU7CgkJCQl2ZWN0b3I8aW50PiBhc2sobiArIDEpOwoJCQkJYXNrW2ldID0gMTsKCQkJCWFza1tqXSA9IDI7CgkJCQljb3V0IDw8ICI/ICI7CgkJCQlmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCQkJCWNvdXQgPDwgYXNrW2ldIDw8ICIgIjsKCQkJCX0KCQkJCWNvdXQgPDwgZW5kbDsKCQkJCWludCB5OwoJCQkJY2luID4+IHk7CgkJCQlpZih5ICE9IGEpIHsKCQkJCQliID0geTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCQlpZihhID4gYikgc3dhcChhLCBiKTsKCQl9CgoJCQoJfQoKCWlmKGIgPT0gMCkgewoJCWNvdXQgPDwgIiEgIiA8PCBuIC0gMSA8PCAnXG4nOwoJCWZvcihpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKSB7CgkJCWNvdXQgPDwgMSA8PCAiICIgPDwgaSA8PCAnXG4nOwoJCX0KCQljb3V0IDw8IGZsdXNoOwoKCQlyZXR1cm4gMDsKCX0KCgkvLyBjb3V0IDw8IGEgPDwgIiAiIDw8IGIgPDwgZW5kbDsKCgoKCWludCBvbmVzID0gMDsKCXZlY3RvcjxwYWlyPGludCxpbnQ+PiBlZGdlczsKCWZvcihpbnQgaSA9IDE7IGkgPD0gbiAmJiBvbmVzIDwgbiAtIDE7IGkrKykgewoJCWludCB6ID0gaTsKCQl3aGlsZSgxKSB7CgkJCWludCBsID0geiArIDEsIHIgPSBuLCB4ID0gLTE7CgkJCXdoaWxlKGwgPD0gcikgewoJCQkJaW50IG1pZCA9IChsICsgcikgLyAyOwoJCQkJaWYoZm91bmQoaSwgeiwgbWlkKSkgewoJCQkJCXIgPSBtaWQgLSAxLCB4ID0gbWlkOyAKCQkJCX0gZWxzZSB7CgkJCQkJbCA9IG1pZCArIDE7CgkJCQl9CgkJCX0KCQkJeiA9IHg7CgkJCW9uZXMgKz0geCAhPSAtMTsKCQkJaWYoeCA9PSAtMSkgYnJlYWs7CgkJCWVkZ2VzLnB1c2hfYmFjayh7aSwgeH0pOwoJCQltZXJnZShpLCB4KTsKCQkJaWYob25lcyA9PSBuIC0gMSkgYnJlYWs7CgkJfQoJfQoKCWNvdXQgPDwgIiEgIiA8PCBuIC0gMSA8PCAnXG4nOwoKCXNldDxpbnQ+IHBhcmVudHM7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCXBhcmVudHMuaW5zZXJ0KGZpbmQoaSkpOwoJfQoJCglmb3IoaW50IGkgPSAxOyBpIDw9IG4gJiYgZWRnZXMuc2l6ZSgpIDwgbiAtIDE7IGkrKykgewoJCWlmKG1lcmdlKGZpbmQoaSksICpwYXJlbnRzLmJlZ2luKCkpKSB7CgkJCWVkZ2VzLnB1c2hfYmFjayh7KnBhcmVudHMuYmVnaW4oKSwgZmluZChpKX0pOwoJCQlhc3NlcnQoKnBhcmVudHMuYmVnaW4oKSA8IGZpbmQoaSkpOwoJCX0KCX0KCglhc3NlcnQoZWRnZXMuc2l6ZSgpID09IG4gLSAxKTsKCWZvcihhdXRvIFt1LCB2XSA6IGVkZ2VzKSB7CgkJaWYodSA+IHYpIGNvdXQgPDwgdiA8PCAiICIgPDwgdSA8PCAnXG4nOwoJCWVsc2UgY291dCA8PCB1IDw8ICIgIiA8PCB2IDw8ICdcbic7Cgl9Cgljb3V0IDw8IGZsdXNoOwogCn0=