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.*;
public class Solution
{
    static class FastReader 
    { 
        BufferedReader br; 
        StringTokenizer st; 
  
        public FastReader() 
        { 
            br = new BufferedReader(new
                     InputStreamReader(System.in)); 
        } 
  
        String next() 
        { 
            while (st == null || !st.hasMoreElements()) 
            { 
                try
                { 
                    st = new StringTokenizer(br.readLine()); 
                } 
                catch (IOException  e) 
                { 
                    e.printStackTrace(); 
                } 
            } 
            return st.nextToken(); 
        } 
  
        int nextInt() 
        { 
            return Integer.parseInt(next()); 
        } 
  
        long nextLong() 
        { 
            return Long.parseLong(next()); 
        } 
  
        double nextDouble() 
        { 
            return Double.parseDouble(next()); 
        } 
  
        String nextLine() 
        { 
            String str = ""; 
            try
            { 
                str = br.readLine(); 
            } 
            catch (IOException e) 
            { 
                e.printStackTrace(); 
            } 
            return str; 
        } 
    }
    static final long mod=(long)1e9+7;
    public static long pow(long a,int p)
    {
        long res=1;
        while(p>0)
        {
            if(p%2==1)
            {
                p--;
                res*=a;
                res%=mod;
            }
            else
            {
                a*=a;
                a%=mod;
                p/=2;
            }
        }
        return res;
    }
    static class Pair
    {
        int u,v;
        Pair(int u,int v)
        {
            this.u=u;
            this.v=v;
        }
    }
    /*static class Pair implements Comparable<Pair>
    {
        int v,l;
        Pair(int v,int l)
        {
            this.v=v;
            this.l=l;
        }
        public int compareTo(Pair p)
        {
            return l-p.l; 
        }
    }*/
    static int gcd(int a,int b)
    {
        if(b%a==0)
        return a;
        return gcd(b%a,a);
    }
    public static class comp implements Comparator<Integer>
    {
        public int compare(Integer o1,Integer o2)
        {
            return o1%2-o2%2;
        }
    }
    public static void dfs(int u,boolean vis[],ArrayList<Integer> edge[])
    {
        vis[u]=true;
        for(int v:edge[u])
        {
            if(!vis[v])
            dfs(v,vis,edge);
        }
    }
    public static void main(String args[])throws Exception
    {
        FastReader fs=new FastReader();
        PrintWriter pw=new PrintWriter(System.out);
        // int tc=fs.nextInt();
        int n=fs.nextInt();
        pw.println("? 1");
        pw.flush();
        int o=0,e=0;
        int a[]=new int[n+1];
        for(int i=1;i<=n;i++)
        a[i]=fs.nextInt();
        for(int i=2;i<=n;i++)
        {
            if(a[i]%2==0)
            e++;
            else
            o++;
        }
        TreeSet<String> ts=new TreeSet<>();
        for(int i=1;i<=n;i++)
        {
            if(a[i]==1)
            ts.add("1 "+i);
        }
        int q=(n+1)/2;
        --q;
        if(e<=q)
        {
            ArrayList<Integer> list=new ArrayList<>();
            for(int i=2;i<=n;i++)
            {
                if(a[i]%2==0)
                list.add(i);
            }
            for(int j:list)
            {
                pw.println("? "+j);
                pw.flush();
                for(int i=1;i<=n;i++)
                {
                    int req=fs.nextInt();
                    if(req==1&&!ts.contains(i+" "+j)&&!ts.contains(j+" "+i))
                    ts.add(i+" "+j);
                }
            }
        }
        else
        {
            ArrayList<Integer> list=new ArrayList<>();
            for(int i=2;i<=n;i++)
            {
                if(a[i]%2!=0)
                list.add(i);
            }
            for(int j:list)
            {
                pw.println("? "+j);
                pw.flush();
                for(int i=1;i<=n;i++)
                {
                    int req=fs.nextInt();
                    if(req==1&&!ts.contains(i+" "+j)&&!ts.contains(j+" "+i))
                    ts.add(i+" "+j);
                }
            }
        }
        pw.println("!");
        while(ts.size()>0)
        pw.println(ts.pollFirst());
        pw.flush();
        pw.close();
    }
}