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

import java.util.*;
import java.io.*;
import java.math.BigInteger;
public class Codechef{
    //SOLUTION BEGIN
	
    void pre() throws Exception{}
    static long N=1000000007;
    class mycomp implements Comparator<pair>{
    	public int compare(pair a , pair b) {
    		if(a.x<b.x) {
    			return 1;
    		}
    		else if(a.x>b.x) {
    			return -1;
    		}
    		if(a.y<b.y) {
    			return 1;
    		}else if(a.y>b.y) {
    			return -1;
    		}
    		return 0;
    	}
    }
    void solve(int TC) throws Exception{
    	int n=ni();
    	System.out.println("? 1");
    	ArrayList<Integer> odd=new ArrayList<Integer>();
    	ArrayList<Integer> even=new ArrayList<Integer>();
    	int dis[]=new int[n+1];
    	ArrayList<pair> edges=new ArrayList<pair>();
    	dis[1]=ni();
    	for(int i=2;i<=n;i++) {
    		dis[i]=ni();
    		if(dis[i]%2==0) {
    			even.add(i);
    		}
    		else {
    			odd.add(i);
    		}
    		if(dis[i]==1) {
    			edges.add(new pair(1,i));
    		}
    		
    	}
    	if(even.size()> odd.size()) {
    		ArrayList<Integer> temp=even;
    		even=odd;
    		odd=temp;
    	}
    	int len=even.size();
    	for(int i=0;i<len;i++) {
    		int next=even.get(i);
    		System.out.println("? "+next);
    		for(int j=1;j<=n;j++) {
    			dis[j]=ni();
    			if(dis[j]==1) {
    				int a=next;
    				int b=j;
    				if(a>b) {
    					int temp=a;
    					a=b;
    					b=temp;
    				}
    				edges.add(new pair(a,b));
    			}
    		}
    	}
    	Collections.sort(edges,new mycomp());
    	System.out.println("!");
    	len = edges.size();
    	pair a=edges.get(0),b;
    	for(int i=1;i<len;i++) {
    		b=edges.get(i);
    		if(a.x==b.x && a.y==b.y) {
    			
    		}else {
    			pn(a.x+" "+a.y);
    		}
    		a=b;
    	}
    	pn(a.x+" "+a.y);
    	
    }
               
    //SOLUTION END
    void hold(boolean b)throws Exception{if(!b)throw new Exception("Hold right there, Sparky!");}
    static boolean multipleTC = false;
    FastReader in;PrintWriter out;
    void run() throws Exception{
        in = new FastReader();
        out = new PrintWriter(System.out);
        
        
    	
        int T = (multipleTC)?ni():1;
        pre();for(int t = 1; t<= T; t++)solve(t);
        out.flush();
        out.close();
    }
    public static void main(String[] args) throws Exception{
        new Codechef().run();
    }
    int bit(long n){return (n==0)?0:(1+bit(n&(n-1)));}
    void p(Object o){out.print(o);}
    void pn(Object o){out.println(o);}
    void pni(Object o){out.println(o);out.flush();}
    String n()throws Exception{return in.next();}
    String nln()throws Exception{return in.nextLine();}
    int ni()throws Exception{return Integer.parseInt(in.next());}
    long nl()throws Exception{return Long.parseLong(in.next());}
    double nd()throws Exception{return Double.parseDouble(in.next());}

    class FastReader{
        BufferedReader br;
        StringTokenizer st;
        public FastReader(){
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        public FastReader(String s) throws Exception{
            br = new BufferedReader(new FileReader(s));
        }

        String next() throws Exception{
            while (st == null || !st.hasMoreElements()){
                try{
                    st = new StringTokenizer(br.readLine());
                }catch (IOException  e){
                    throw new Exception(e.toString());
                }
            }
            return st.nextToken();
        }

        String nextLine() throws Exception{
            String str = "";
            try{   
                str = br.readLine();
            }catch (IOException e){
                throw new Exception(e.toString());
            }  
            return str;
        }
    }
    class pair{
    	int x, y;
    	pair(int x,int y){
    		this.x=x;
    		this.y=y;
    	}
    }
    
}