5
5 3
2 4
3 1
4 5
 4
2 4
3 2
2 1
 5
5 3
2 4
3 1
4 5
 2
1 2
 4
3 4
2 3
3 1
 10
8 10
2 9
7 8
4 1
7 3
4 7
2 5
2 4
4 6
 5
3 4
3 2
3 1
1 5
 3
1 2
2 3
 5
1 2
1 3
1 4
1 5

1 2
2 3
2 4
 1 3
2 4
3 5
4 5
 1 2
 1 3
2 3
3 4
 1 4
2 4
2 5
2 9
3 7
4 6
4 7
7 8
8 10
 1 3
1 5
2 3
3 4
 1 2
2 3
 1 2
1 3
1 4
1 5

#include<bits/stdc++.h>
#define ll long long int
#define pb push_back
#define po pop_back
#define mp make_pair
#define fi first
#define se second
#define LLM LONG_LONG_MAX
#define LLm LONG_LONG_MIN
#define hello ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define MOD 1000000007
using namespace std;
bool comp(ll a,ll b){if(a>b)return true;else return false;}
int isP(ll n){if(n==1)return 0;if(n==2 || n==3)return 1;for(ll i=2;i<=sqrt(n);i++){if(n%i==0)return 0;}return 1;}
ll power(ll a,ll b){if(b==0)return 1;if(b==1) return a;ll t=power(a,b/2);if(b%2==1) return t*t*a;else return t*t;}
ll powMOD(ll x,ll y){if(y==0)return 1;if(y==1)return x;ll t=powMOD(x,y/2);if(y%2==1)return t*t%MOD*x%MOD;else return t*t%MOD;}

vector<ll> g[2001];
vector<ll> g1[2001];
bool done[2001];
ll n;
ll ct=0;
ll cnt=0;
void fun(ll v,ll u)
{
	if(cnt==ceil(n/2.0)){
		vector<ll> va;
		for(ll i=1;i<=n;i++){
			if(!g1[i].empty()){
				if(g1[i][u-1]==2) va.pb(i);
			}
		}
		if((ll)va.size()>=2){
			for(ll j=0;j<n;j++){
				if(g1[va[0]][j]==1 && g1[va[1]][j]==1){
					g[j+1].pb(u);
					ct++;
					return;
				}	
			}
		}
		else{
			ll cc[n+1]={};
			for(ll i=1;i<=n;i++){
				if(!g1[i].empty()){
					for(ll j=0;j<g1[i].size();j++){
						if(g1[i][j]==1) cc[j+1]++;
					}
				}
			}
			for(ll i=0;i<g1[va[0]].size();i++){
				if(g1[va[0]][i]==1){
					if(cc[i+1]==1){
						g[i+1].pb(u);
						ct++;
						return;
					}
				}
			}
		}
	}
	cnt++;
	cout<<"? "<<u<<endl;
	for(ll i=1;i<=n;i++){
		ll d;
		cin>>d;
		g1[u].pb(d);
	}
	done[u]=1;
	ll idx=0;
	for(ll i=0;i<n;i++){
		if(g1[v][i]==1 && g1[u][i]==1){
			g[i+1].pb(u);
			idx=i+1;
			ct++;
		}
		else if(g1[v][i]==3 && g1[u][i]==1){
			g[u].pb(i+1);
			ct++;
		}
	}
	for(ll i=0;i<n;i++){
		if(g1[u][i]==2 && !done[i+1]){
			if(ct==n-1) break;
			fun(u,i+1);
		}
	}
}
int main()
{
    /*//----Hello World----//*/
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    hello;
    
    ll t;
//    cin>>t;
    t=1;
	while(t--){
		cin>>n;
		cnt++;
		cout<<"? "<<1<<endl;
		for(ll i=1;i<=n;i++){
			ll d;
			cin>>d;
			g1[1].pb(d);
		}
		for(ll i=0;i<n;i++){
			if(g1[1][i]==1){
				g[1].pb(i+1);
				ct++;
			}
		}
		done[1]=1;
		for(ll i=0;i<n;i++){
			if(g1[1][i]==2 && !done[i+1]){
				if(ct==n-1) break;
				fun(1,i+1);
			}
		}
		cout<<"!"<<endl;
		for(ll i=1;i<=n;i++){
			for(ll j=0;j<g[i].size();j++) cout<<i<<" "<<g[i][j]<<endl;
		}
	}
	
	/*//----Hello World----//*/
    return 0;  
}
