#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#include<set>
#include<stack>
#include<vector>
#include<queue>
#include<functional>
#include<fstream>
#include <iomanip>
using namespace std;
typedef long long LL;
//struct node
//{
//	char s[25];
//	int n;
//	friend bool operator<(node a,node b)
//	{
//		return a.n < b.n;
//	}
//}a[100005],b[100005];
string ss[100005];
int temp[100005];
map<string, int>mp;
int main()
{
	int n, m, k;
	cin >> n >> m >> k;
	getchar();
	for (int i = 1; i <= n; i++)
	{
		cin >> ss[i];
	}
	for (int i = 1; i <= n; i++)
	{
		int p;
		scanf("%d", &p);
		mp[ss[i]] = p;
	}
	//for (int i = 1; i <= k; i++)
	//{
	//	int num;
	//	scanf("%d", &num);
	//	for (int j = 1; j <= num; j++)
	//	{
	//		if (j == 1)
	//			b[i] = a[j];
	//		else
	//			b[i] = min(b[i], a[j]);
	//	}
	//}
	for (int i = 1; i <= k; i++)
	{
		int num;
		scanf("%d", &num);
		int mini = 0x3f3f3f3f;
		for (int j = 1; j <= num; j++)
		{
			scanf("%d",&temp[j]);
			if (mp[ss[temp[j]]] < mini)
				mini = mp[ss[temp[j]]];
		}
		for (int j = 1; j <= num; j++)
		{
			mp[ss[temp[j]]] = mini;
		}
	}
	LL ans = 0;
	for (int i = 1; i <= m; i++)
	{
		string s;
		cin >> s;
		ans += mp[s];
	}
	cout << ans << endl;;
	return 0;
}


#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#include<set>
#include<stack>
#include<vector>
#include<queue>
#include<functional>
#include<fstream>
#include <iomanip>
using namespace std;
typedef long long LL;
//struct node
//{
//	char s[25];
//	int n;
//	friend bool operator<(node a,node b)
//	{
//		return a.n < b.n;
//	}
//}a[100005],b[100005];
string ss[100005];
LL temp[100005];
map<string, LL>mp;
int main()
{
	int n, m, k;
	cin >> n >> m >> k;
	getchar();
	for (int i = 1; i <= n; i++)
	{
		cin >> ss[i];
	}
	for (int i = 1; i <= n; i++)
	{
		LL p;
		scanf("%I64d", &p);
		mp[ss[i]] = p;
	}
	//for (int i = 1; i <= k; i++)
	//{
	//	int num;
	//	scanf("%d", &num);
	//	for (int j = 1; j <= num; j++)
	//	{
	//		if (j == 1)
	//			b[i] = a[j];
	//		else
	//			b[i] = min(b[i], a[j]);
	//	}
	//}
	for (int i = 1; i <= k; i++)
	{
		int num;
		scanf("%d", &num);
		LL mini = 0x7fffffffffffffff;
		cout << mini << "**\n";
		for (int j = 1; j <= num; j++)
		{
			scanf("%d",&temp[j]);
			if (mp[ss[temp[j]]] < mini)
				mini = mp[ss[temp[j]]];
		}
		for (int j = 1; j <= num; j++)
		{
			mp[ss[temp[j]]] = mini;
		}
	}
	LL ans = 0;
	for (int i = 1; i <= m; i++)
	{
		string s;
		cin >> s;
		ans += mp[s];
	}
	cout << ans << endl;;
	return 0;
}


#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#include<set>
#include<stack>
#include<vector>
#include<queue>
#include<functional>
#include<fstream>
#include <iomanip>
using namespace std;
typedef long long LL;
//struct node
//{
//	char s[25];
//	int n;
//	friend bool operator<(node a,node b)
//	{
//		return a.n < b.n;
//	}
//}a[100005],b[100005];
string ss[100005];
LL temp[100005];
map<string, LL>mp;
int main()
{
	int n, m, k;
	cin >> n >> m >> k;
	getchar();
	for (int i = 1; i <= n; i++)
	{
		cin >> ss[i];
	}
	for (int i = 1; i <= n; i++)
	{
		LL p;
		scanf("%I64d", &p);
		mp[ss[i]] = p;
	}
	//for (int i = 1; i <= k; i++)
	//{
	//	int num;
	//	scanf("%d", &num);
	//	for (int j = 1; j <= num; j++)
	//	{
	//		if (j == 1)
	//			b[i] = a[j];
	//		else
	//			b[i] = min(b[i], a[j]);
	//	}
	//}
	for (int i = 1; i <= k; i++)
	{
		int num;
		scanf("%d", &num);
		LL mini = 1e18;
		for (int j = 1; j <= num; j++)
		{
			scanf("%d",&temp[j]);
			if (mp[ss[temp[j]]] < mini)
				mini = mp[ss[temp[j]]];
		}
		for (int j = 1; j <= num; j++)
		{
			mp[ss[temp[j]]] = mini;
		}
	}
	LL ans = 0;
	for (int i = 1; i <= m; i++)
	{
		string s;
		cin >> s;
		ans += mp[s];
	}
	cout << ans << endl;;
	return 0;
}


#include <iostream>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	int v[k][n+2-k];
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		int j = 0;
		for(j=0;j<k1;j++){
			cin >> v[i][j];
			v[i][j]--;
			if(min>cost[v[i][j]]){
				min = cost[v[i][j]];
			}
		}
		v[i][n+1-k] = min;
		if(j!=n+1-k)
			v[i][j] = -1;
	}
	// for(int i=0;i<k;i++){
	// 	for(int j=0;j<n+2-k;j++){
	// 		cout << v[i][j] << " ";
	// 	}
	// 	// cout << endl;
	// }
	for(int i=0;i<m;i++){
		string temp;
		bool temp1 = false;
		cin >> temp;
		for(int i=0;i<k;i++){
			for(int j=0;j<n+1-k;j++){
				if(v[i][j]==-1){
					break;
				}
				if(temp==a[v[i][j]]){
					int d = v[i][n+1-k];
					// cout << d << " " << temp << " " << i << " " << j<< endl;
					sum += d;
					temp1 = true;
					break;
				}
			}
			if(temp1){
				break;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


#include <iostream>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	int v[k][n+1];
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		int j = 0;
		for(j=0;j<k1;j++){
			cin >> v[i][j];
			v[i][j]--;
			if(min>cost[v[i][j]]){
				min = cost[v[i][j]];
			}
		}
		// cout << min << endl;
		v[i][n] = min;
		if(j!=n)
			v[i][j] = -1;
	}
	for(int i=0;i<m;i++){
		string temp;
		bool temp1 = false;
		cin >> temp;
		for(int i=0;i<k;i++){
			for(int j=0;j<n;j++){
				if(v[i][j]==-1){
					// cout << i << " " << j+1 << endl;
					break;
				}
				if(temp==a[v[i][j]]){
					int d = v[i][n];
					sum += d;
					temp1 = true;
					break;
				}
			}
			if(temp1){
				break;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


#include <iostream>
#include <vector>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	vector<vector<int>> v(k);
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		vector<int> temp(k+1);
		for(int i=0;i<k1;i++){
			cin >> temp[i];
			temp[i]--;
			if(min>cost[temp[i]]){
				min = cost[temp[i]];
			}
		}
		temp[k] = min;
		v[i] = temp;
	}
	for(int i=0;i<m;i++){
		string temp;
		bool temp1 = false;
		cin >> temp;
		for(int i=0;i<k;i++){
			for(int j=0;j<v[i].size()-1;j++){
				if(temp==a[v[i][j]]){
					int d = v[i].size();
					sum += v[i][d-1];
					temp1 = true;
					break;
				}
			}
			if(temp1){
				break;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


#include <iostream>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		int temp[k1];
		int j = 0;
		for(j=0;j<k1;j++){
			cin >> temp[j];
			temp[j]--;
			if(min>cost[temp[j]]){
				min = cost[temp[j]];
			}
		}
		for(int j=0;j<k1;j++){
			cost[temp[j]] = min;
		}

	}
	for(int i=0;i<m;i++){
		string temp;
		cin >> temp;
		for(int i=0;i<n;i++){
			if(a[i]==temp){
				sum+=cost[i];
			}
		}
	}
	cout << sum << endl;
	return 0;
}


#include <iostream>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	map <string, int> name;
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		int temp[k1];
		int j = 0;
		for(j=0;j<k1;j++){
			cin >> temp[j];
			temp[j]--;
			if(min>cost[temp[j]]){
				min = cost[temp[j]];
			}
		}
		for(int j=0;j<k1;j++){
			name[a[temp[j]]] = min;
		}

	}
	for(int i=0;i<m;i++){
		string temp;
		cin >> temp;
		sum+=name[temp];
	}
	cout << sum << endl;
	return 0;
}


#include <iostream>
#include <cstdlib>
#include<bits/stdc++.h>

using namespace std;

int main(){
	int n, k, m;
	cin >> n >> k >> m;
	string a[n];
	int cost[n];
	long long sum = 0;
	for(int i=0;i<n;i++){
		cin >> a[i];
	}
	for(int i=0;i<n;i++){
		cin >> cost[i];
	}
	for(int i=0;i<k;i++){
		int k1;
		int min = INT_MAX;
		cin >> k1;
		int temp[k1];
		int j = 0;
		for(j=0;j<k1;j++){
			cin >> temp[j];
			temp[j]--;
			if(min>cost[temp[j]]){
				min = cost[temp[j]];
			}
		}
		for(int j=0;j<k1;j++){
			cost[temp[j]] = min;
		}

	}
	for(int i=0;i<m;i++){
		string temp;
		cin >> temp;
		for(int i=0;i<n;i++){
			if(a[i]==temp){
				sum+=cost[i];
				break;
			}
		}
	}
	cout << sum << endl;
	return 0;
}


import java.io.*;
import java.util.*;

public class Main
{
      public static void main(String[] args)
      {
            Scanner sc = new Scanner(System.in);

            int n = sc.nextInt();

            if(n <= 5)
            {
                  System.out.println("-1");
            }
            else
            {
                  for(int i=2;i<n-1;i++)
                  {
                        System.out.println("1 "+i);
                  }

                  System.out.println("2 "+(n-1));
                  System.out.println("2 "+n);
            }

            for(int i=2;i<n+1;i++)
            {
                  System.out.println("1 "+i);
            }
      }
}


import java.io.*;
import java.util.*;

public class Main
{
      public static void main(String[] args)
      {
            Scanner sc = new Scanner(System.in);

            int n = sc.nextInt();

            if(n <= 5)
            {
                  System.out.println("-1");
            }
            else
            {
                  for(int i=2;i<n-1;i++)
                  {
                        System.out.println("1 ");
                  }

                  System.out.println("2 "+(n-1));
                  System.out.println("2 "+n);
            }

            for(int i=2;i<n+1;i++)
            {
                  System.out.println("1 "+i);
            }
      }
}


import java.io.*;
import java.util.*;

public class Main
{
      public static void main(String[] args)
      {
            Scanner sc = new Scanner(System.in);

            int n = sc.nextInt();

            if(n <= 5)
            {
                  System.out.println("-1");
            }
            else
            {
                  for(int i=2;i<n-1;i++)
                  {
                        System.out.println("1 ");
                  }

                  System.out.println("2 "+n-1);
                  System.out.println("2 "+n);
            }

            for(int i=2;i<n+1;i++)
            {
                  System.out.println("1 "+i);
            }
      }
}


import java.awt.Point;
import java.io.*;
import java.util.*;
import java.math.BigInteger;

public class VCover {
    static class Solver {
        public void solve(MyReader in, PrintWriter out) {
            int n = in.nextInt();

            if(n <= 5){
                out.println(-1);
                for(int i = 1;i<n;i++){
                    out.println("1 "+(i+1));
                }
                return;

            }

            out.println("1 2\n1 3\n1 4");
            for(int i = 5;i<=n;i++){
                out.println("2 "+i);
            }

            for(int i = 1;i<n;i++){
                out.println("1 "+(i+1));
            }

        }
    }

    public static void main(String[] args) {
        MyReader mr = new MyReader();
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        new Solver().solve(mr, out);
        out.close();
    }

    //    static int[][] dir = {{0,1}, {1,0},{-1,0}, {0,-1}};
//    static int[][] dir = {{0,1}, {1,0},{-1,0}, {0,-1}, {-1,-1},{-1,1}, {1,1}, {1,-1}};
    static class MyReader {
        BufferedReader br;
        StringTokenizer st;

        MyReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception 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 res = "";
            try {
                res = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return res;
        }

        int[] nextIntArray(int n) {
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextInt();
            }

            return arr;
        }

        Integer[] nextIntegerArray(int n) {
            Integer[] arr = new Integer[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextInt();
            }

            return arr;
        }

        Long[] nextLongArray(int n) {
            Long[] arr = new Long[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextLong();
            }

            return arr;
        }

        String[] nextStringArray(int n) {
            String[] arr = new String[n];
            for (int i = 0; i < n; i++) {
                arr[i] = next();
            }
            return arr;
        }
    }

    static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}


import java.awt.Point;
import java.io.*;
import java.util.*;
import java.math.BigInteger;

public class VCover {
    static class Solver {
        public void solve(MyReader in, PrintWriter out) {
            int n = in.nextInt();

            if(n <= 3){
                out.println(-1);
                if(n == 2){
                    out.println("1 2");
                }
                else{
                    out.println("1 2\n2 3");
                }

                return;
            }

            for(int i = 1;i<n;i++){
                out.println("1 "+(i+1));
            }

            for(int i = 1;i<n;i++){
                out.println(i+" "+(i+1));
            }

        }
    }

    public static void main(String[] args) {
        MyReader mr = new MyReader();
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        new Solver().solve(mr, out);
        out.close();
    }

    //    static int[][] dir = {{0,1}, {1,0},{-1,0}, {0,-1}};
//    static int[][] dir = {{0,1}, {1,0},{-1,0}, {0,-1}, {-1,-1},{-1,1}, {1,1}, {1,-1}};
    static class MyReader {
        BufferedReader br;
        StringTokenizer st;

        MyReader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }

        String next() {
            while (st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (Exception 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 res = "";
            try {
                res = br.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return res;
        }

        int[] nextIntArray(int n) {
            int[] arr = new int[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextInt();
            }

            return arr;
        }

        Integer[] nextIntegerArray(int n) {
            Integer[] arr = new Integer[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextInt();
            }

            return arr;
        }

        Long[] nextLongArray(int n) {
            Long[] arr = new Long[n];
            for (int i = 0; i < n; i++) {
                arr[i] = nextLong();
            }

            return arr;
        }

        String[] nextStringArray(int n) {
            String[] arr = new String[n];
            for (int i = 0; i < n; i++) {
                arr[i] = next();
            }
            return arr;
        }
    }

    static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}


/* package codechef; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class Codechef
{
	public static void main (String[] args) throws java.lang.Exception
	{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		if(n<=5) System.out.println(-1);
		else {
		    System.out.println(1+" "+2);
		    System.out.println(2+" "+3);
		    System.out.println(2+" "+4);
		    for(int i=5;i<=n;i++){
		        System.out.println(3+" "+i);
		    }
		}
		for(int i=2;i<=n;i++){System.out.println(1+" "+i);}
	}
}


import java.io.*;
import java.util.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class cf959c {

    public static void main(String[] args) throws IOException {
        int n = ri();
        if (n < 6) {
            prln(-1);
        } else {
            prln(1, 2);
            prln(2, 3);
            prln(2, 4);
            prln(1, 5);
            prln(1, 6);
            for (int i = 7; i <= n; ++i) {
                prln(2, i);
            }
        }
        for (int i = 1; i < n; ++i) {
            prln(i, i + 1);
        }
        close();
    }

    static BufferedReader __in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter __out = new PrintWriter(new OutputStreamWriter(System.out));
    static StringTokenizer input;
    static Random __rand = new Random();

    // references
    // IBIG = 1e9 + 7
    // IMAX ~= 2e9
    // LMAX ~= 9e18

    // constants
    static final int IBIG = 1000000007;
    static final int IMAX = 2147483647;
    static final int IMIN = -2147483648;
    static final long LMAX = 9223372036854775807L;
    static final long LMIN = -9223372036854775808L;
    // math util
    static int minof(int a, int b, int c) {return min(a, min(b, c));}
    static int minof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); int min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static long minof(long a, long b, long c) {return min(a, min(b, c));}
    static long minof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); long min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static int maxof(int a, int b, int c) {return max(a, max(b, c));}
    static int maxof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); int max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static long maxof(long a, long b, long c) {return max(a, max(b, c));}
    static long maxof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); long max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static int powi(int a, int b) {if (a == 0) return 0; int ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static long powl(long a, int b) {if (a == 0) return 0; long ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static int fli(double d) {return (int) d;}
    static int cei(double d) {return (int) ceil(d);}
    static long fll(double d) {return (long) d;}
    static long cel(double d) {return (long) ceil(d);}
    static int gcf(int a, int b) {return b == 0 ? a : gcf(b, a % b);}
    static long gcf(long a, long b) {return b == 0 ? a : gcf(b, a % b);}
    static int lcm(int a, int b) {return a * b / gcf(a, b);}
    static long lcm(long a, long b) {return a * b / gcf(a, b);}
    static int randInt(int min, int max) {return __rand.nextInt(max - min + 1) + min;}
    static long mix(long x) {x += 0x9e3779b97f4a7c15L; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9L; x = (x ^ (x >> 27)) * 0x94d049bb133111ebL; return x ^ (x >> 31);}
    // array util
    static void reverse(int[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {int swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(long[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {long swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(double[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {double swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(char[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {char swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void shuffle(int[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); int swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(long[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); long swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(double[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); double swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void rsort(int[] a) {shuffle(a); sort(a);}
    static void rsort(long[] a) {shuffle(a); sort(a);}
    static void rsort(double[] a) {shuffle(a); sort(a);}
    static int[] copy(int[] a) {int[] ans = new int[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static long[] copy(long[] a) {long[] ans = new long[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static double[] copy(double[] a) {double[] ans = new double[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static char[] copy(char[] a) {char[] ans = new char[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    // input
    static void r() throws IOException {input = new StringTokenizer(rline());}
    static int ri() throws IOException {return Integer.parseInt(rline());}
    static long rl() throws IOException {return Long.parseLong(rline());}
    static double rd() throws IOException {return Double.parseDouble(rline());}
    static int[] ria(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni(); return a;}
    static int[] riam1(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni() - 1; return a;}
    static long[] rla(int n) throws IOException {long[] a = new long[n]; r(); for (int i = 0; i < n; ++i) a[i] = nl(); return a;}
    static double[] rda(int n) throws IOException {double[] a = new double[n]; r(); for (int i = 0; i < n; ++i) a[i] = nd(); return a;}
    static char[] rcha() throws IOException {return rline().toCharArray();}
    static String rline() throws IOException {return __in.readLine();}
    static String n() {return input.nextToken();}
    static int rni() throws IOException {r(); return ni();}
    static int ni() {return Integer.parseInt(n());}
    static long rnl() throws IOException {r(); return nl();}
    static long nl() {return Long.parseLong(n());}
    static double rnd() throws IOException {r(); return nd();}
    static double nd() {return Double.parseDouble(n());}
    // output
    static void pr(int i) {__out.print(i);}
    static void prln(int i) {__out.println(i);}
    static void pr(long l) {__out.print(l);}
    static void prln(long l) {__out.println(l);}
    static void pr(double d) {__out.print(d);}
    static void prln(double d) {__out.println(d);}
    static void pr(char c) {__out.print(c);}
    static void prln(char c) {__out.println(c);}
    static void pr(char[] s) {__out.print(new String(s));}
    static void prln(char[] s) {__out.println(new String(s));}
    static void pr(String s) {__out.print(s);}
    static void prln(String s) {__out.println(s);}
    static void pr(Object o) {__out.print(o);}
    static void prln(Object o) {__out.println(o);}
    static void prln() {__out.println();}
    static void pryes() {prln("yes");}
    static void pry() {prln("Yes");}
    static void prY() {prln("YES");}
    static void prno() {prln("no");}
    static void prn() {prln("No");}
    static void prN() {prln("NO");}
    static void pryesno(boolean b) {prln(b ? "yes" : "no");};
    static void pryn(boolean b) {prln(b ? "Yes" : "No");}
    static void prYN(boolean b) {prln(b ? "YES" : "NO");}
    static void prln(int... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(long... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(double... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static <T> void prln(Collection<T> c) {int n = c.size() - 1; Iterator<T> iter = c.iterator(); for (int i = 0; i < n; pr(iter.next()), pr(' '), ++i); if (n >= 0) prln(iter.next()); else prln();}
    static void h() {prln("hlfd"); flush();}
    static void flush() {__out.flush();}
    static void close() {__out.close();}
}


import java.io.*;
import java.util.*;

import static java.lang.Math.*;
import static java.util.Arrays.*;

public class cf959c {

    public static void main(String[] args) throws IOException {
        int n = ri();
        if (n < 5) {
            prln(-1);
        } else {
            prln(1, 2);
            prln(2, 3);
            prln(2, 4);
            prln(1, 5);
            for (int i = 5; i < n; ++i) {
                prln(i, i + 1);
            }
        }
        for (int i = 1; i < n; ++i) {
            prln(i, i + 1);
        }
        close();
    }

    static BufferedReader __in = new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter __out = new PrintWriter(new OutputStreamWriter(System.out));
    static StringTokenizer input;
    static Random __rand = new Random();

    // references
    // IBIG = 1e9 + 7
    // IMAX ~= 2e9
    // LMAX ~= 9e18

    // constants
    static final int IBIG = 1000000007;
    static final int IMAX = 2147483647;
    static final int IMIN = -2147483648;
    static final long LMAX = 9223372036854775807L;
    static final long LMIN = -9223372036854775808L;
    // math util
    static int minof(int a, int b, int c) {return min(a, min(b, c));}
    static int minof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); int min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static long minof(long a, long b, long c) {return min(a, min(b, c));}
    static long minof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return min(x[0], x[1]); if (x.length == 3) return min(x[0], min(x[1], x[2])); long min = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] < min) min = x[i]; return min;}
    static int maxof(int a, int b, int c) {return max(a, max(b, c));}
    static int maxof(int... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); int max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static long maxof(long a, long b, long c) {return max(a, max(b, c));}
    static long maxof(long... x) {if (x.length == 1) return x[0]; if (x.length == 2) return max(x[0], x[1]); if (x.length == 3) return max(x[0], max(x[1], x[2])); long max = x[0]; for (int i = 1; i < x.length; ++i) if (x[i] > max) max = x[i]; return max;}
    static int powi(int a, int b) {if (a == 0) return 0; int ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static long powl(long a, int b) {if (a == 0) return 0; long ans = 1; while (b > 0) {if ((b & 1) > 0) ans *= a; a *= a; b >>= 1;} return ans;}
    static int fli(double d) {return (int) d;}
    static int cei(double d) {return (int) ceil(d);}
    static long fll(double d) {return (long) d;}
    static long cel(double d) {return (long) ceil(d);}
    static int gcf(int a, int b) {return b == 0 ? a : gcf(b, a % b);}
    static long gcf(long a, long b) {return b == 0 ? a : gcf(b, a % b);}
    static int lcm(int a, int b) {return a * b / gcf(a, b);}
    static long lcm(long a, long b) {return a * b / gcf(a, b);}
    static int randInt(int min, int max) {return __rand.nextInt(max - min + 1) + min;}
    static long mix(long x) {x += 0x9e3779b97f4a7c15L; x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9L; x = (x ^ (x >> 27)) * 0x94d049bb133111ebL; return x ^ (x >> 31);}
    // array util
    static void reverse(int[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {int swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(long[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {long swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(double[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {double swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void reverse(char[] a) {for (int i = 0, n = a.length, half = n / 2; i < half; ++i) {char swap = a[i]; a[i] = a[n - i - 1]; a[n - i - 1] = swap;}}
    static void shuffle(int[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); int swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(long[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); long swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void shuffle(double[] a) {int n = a.length - 1; for (int i = 0; i < n; ++i) {int ind = randInt(i, n); double swap = a[i]; a[i] = a[ind]; a[ind] = swap;}}
    static void rsort(int[] a) {shuffle(a); sort(a);}
    static void rsort(long[] a) {shuffle(a); sort(a);}
    static void rsort(double[] a) {shuffle(a); sort(a);}
    static int[] copy(int[] a) {int[] ans = new int[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static long[] copy(long[] a) {long[] ans = new long[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static double[] copy(double[] a) {double[] ans = new double[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    static char[] copy(char[] a) {char[] ans = new char[a.length]; for (int i = 0; i < a.length; ++i) ans[i] = a[i]; return ans;}
    // input
    static void r() throws IOException {input = new StringTokenizer(rline());}
    static int ri() throws IOException {return Integer.parseInt(rline());}
    static long rl() throws IOException {return Long.parseLong(rline());}
    static double rd() throws IOException {return Double.parseDouble(rline());}
    static int[] ria(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni(); return a;}
    static int[] riam1(int n) throws IOException {int[] a = new int[n]; r(); for (int i = 0; i < n; ++i) a[i] = ni() - 1; return a;}
    static long[] rla(int n) throws IOException {long[] a = new long[n]; r(); for (int i = 0; i < n; ++i) a[i] = nl(); return a;}
    static double[] rda(int n) throws IOException {double[] a = new double[n]; r(); for (int i = 0; i < n; ++i) a[i] = nd(); return a;}
    static char[] rcha() throws IOException {return rline().toCharArray();}
    static String rline() throws IOException {return __in.readLine();}
    static String n() {return input.nextToken();}
    static int rni() throws IOException {r(); return ni();}
    static int ni() {return Integer.parseInt(n());}
    static long rnl() throws IOException {r(); return nl();}
    static long nl() {return Long.parseLong(n());}
    static double rnd() throws IOException {r(); return nd();}
    static double nd() {return Double.parseDouble(n());}
    // output
    static void pr(int i) {__out.print(i);}
    static void prln(int i) {__out.println(i);}
    static void pr(long l) {__out.print(l);}
    static void prln(long l) {__out.println(l);}
    static void pr(double d) {__out.print(d);}
    static void prln(double d) {__out.println(d);}
    static void pr(char c) {__out.print(c);}
    static void prln(char c) {__out.println(c);}
    static void pr(char[] s) {__out.print(new String(s));}
    static void prln(char[] s) {__out.println(new String(s));}
    static void pr(String s) {__out.print(s);}
    static void prln(String s) {__out.println(s);}
    static void pr(Object o) {__out.print(o);}
    static void prln(Object o) {__out.println(o);}
    static void prln() {__out.println();}
    static void pryes() {prln("yes");}
    static void pry() {prln("Yes");}
    static void prY() {prln("YES");}
    static void prno() {prln("no");}
    static void prn() {prln("No");}
    static void prN() {prln("NO");}
    static void pryesno(boolean b) {prln(b ? "yes" : "no");};
    static void pryn(boolean b) {prln(b ? "Yes" : "No");}
    static void prYN(boolean b) {prln(b ? "YES" : "NO");}
    static void prln(int... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(long... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static void prln(double... a) {for (int i = 0, len = a.length - 1; i < len; pr(a[i]), pr(' '), ++i); if (a.length > 0) prln(a[a.length - 1]); else prln();}
    static <T> void prln(Collection<T> c) {int n = c.size() - 1; Iterator<T> iter = c.iterator(); for (int i = 0; i < n; pr(iter.next()), pr(' '), ++i); if (n >= 0) prln(iter.next()); else prln();}
    static void h() {prln("hlfd"); flush();}
    static void flush() {__out.flush();}
    static void close() {__out.close();}
}


import java.util.*;
import java.io.*;
public class C473
{
    public static void main(String [] args)
    {
        MyScanner sc = new MyScanner();
        PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
        int n = sc.nextInt();
        if (n >= 6) {
            for (int i = 2; i <= n - 2; i++) {
                out.println(1 + " " + i);
            }
            out.println(2 + " " + (n - 1));
            out.println(2 + " " + n);
        } else {
            out.println(-1);
        }
        for (int i = 1; i < n; i++) {
            out.println(i + " " + (i + 1));
        }
        out.close();
    }

    //-----------MyScanner class for faster input----------
    public static class MyScanner {
        BufferedReader br;
        StringTokenizer st;

        public MyScanner() {
            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;
        }

    }

}


import java.util.*;
import java.io.*;

public class MahmoudandEhabandthewrongalgorithm {

	// https://codeforces.com/contest/959/problem/C

	public static void main(String[] args) throws IOException, FileNotFoundException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		//BufferedReader in = new BufferedReader(new FileReader("MahmoudandEhabandthewrongalgorithm"));

		int n = Integer.parseInt(in.readLine());

		// wrong
		if (n >= 6) {
			System.out.println("1 2");
			System.out.println("1 3");
			System.out.println("1 4");
			System.out.println("2 5");
			System.out.println("2 6");
			for (int i=7; i<=n; i++) {
				System.out.println("1 " + i);
			}
		}
		else {
			System.out.println(-1);
		}

		// right --- just use a tree with one parent and one child always
		for (int i=1; i<=n-1; ++i) {
			System.out.println(i + " " + (i+1));
		}
	}
}

/*

	for the one that doesn't work, something like this will work

		1
	  / |  \
	 x	a	2
		   / \
		  y   z

		The actual answer will be (2), because u just choose (1) and (2).
		Though, by the algorithm, you either choose (x,a,2) or (1,y,z) which is wrong

		Any more just keep connecting it to 1 and the algo will always be incorrect
*/


import java.util.*;
import java.io.*;

public class File {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();

		// There are no invalid trees for these cases.
		if (n <= 7) {
			System.out.println(-1);
		}
		else {
			// Print the same base answer.
			System.out.println(1 + " " + 2);
			System.out.println(1 + " " + 3);
			System.out.println(2 + " " + 4);
			System.out.println(2 + " " + 5);
			System.out.println(3 + " " + 6);
			System.out.println(4 + " " + 7);
			System.out.println(4 + " " + 8);

			int currNode = 9;
			for (int i = 0; i < n - 8; i++) {
				System.out.println(4 + " " + currNode++);
			}
		}

		// A valid answer seems to be a straight line of all the nodes.
		for (int i = 1; i + 1 <= n; i++) {
			int u = i;
			int v = i + 1;

			System.out.println(u + " " + v);
		}
	}
}


import java.util.*;
import java.io.*;

public class File {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

		int n = sc.nextInt();

		// There are no invalid trees for these cases.
		if (n <= 5) {
			System.out.println(-1);
		}
		else {
			// Give root
			// 3 children
			// given one of those children the rest of the nodes.
			// Answer should always be 2, the root and that child,
			// but algorithm will suggest 3
			int edges = n - 1;

			System.out.println(1 + " " + 2);
			edges--;

			for (int next = 3; next <= 4; next++) {
				System.out.println(1 + " " + next);
				edges--;
			}

			int nextNode = 5;

			while (edges > 0) {
				System.out.println(2 + " " + nextNode++);
				edges--;
			}
		}

		// A valid answer seems to be a straight line of all the nodes.
		for (int i = 1; i + 1 <= n; i++) {
			int u = i;
			int v = i + 1;

			System.out.println(u + " " + v);
		}
	}
}


import java.util.*;
public class Main
{
	public static void main(String[] args) {
		Scanner sc= new Scanner(System.in);
		int n;
		n= sc.nextInt();
		if(n<=5)
		{
		    System.out.println(-1);
		}
		else{
		    int k= n-2;
		    for(int i=2;i<=k;i++)
		    {
		        System.out.println(1+" "+i);
		    }
		    k+=1;
		    System.out.println(2+" "+k);
		    k+=1;
		    System.out.println(2+" "+k);
		}
		for(int i=2;i<=n;i++)
		{
		    System.out.println(1+" "+i);
		}
	}
}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Contest {
	private static PrintWriter out = new PrintWriter(System.out);
	private static int n, m, k, tc;
	private static char[][] a;
	private static int[][] grid;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();

		// Incorrect tree
		if(n < 8) {
			out.println(-1);
		} else {
			out.println(1 + " " + 2);
			out.println(1 + " " + 3);
			out.println(3 +" " + 4);
			out.println(3 +" " + 5);
			out.println(3 +" " + 6);
			for(int i = 4;i <= n;i += 3) {
				for(int j = i + 3;j <= i + 5 && j <= n;j++) {
					out.println(i + " " + j);
				}
			}
		}

		// Correct tree
		for (int i = 2; i <= n; i++) {
			out.println(1 + " " + i);
		}

		out.flush();
	}

	private static void sort(int[] a, int n) {
		ArrayList<Integer> b = new ArrayList<Integer>();
		for (int i = 0; i < n; i++)
			b.add(a[i]);
		Collections.sort(b);
		for (int i = 0; i < n; i++)
			a[i] = b.get(i);
	}

	static final Random random = new Random();

	static void ruffleSort(int[] a) {
		int n = a.length;// shuffle, then sort
		for (int i = 0; i < n; i++) {
			int oi = random.nextInt(n), temp = a[oi];
			a[oi] = a[i];
			a[i] = temp;
		}
		java.util.Arrays.sort(a);
	}

//	private static class Scanner {
//		public BufferedReader reader;
//		public StringTokenizer st;
//
//		public Scanner(InputStream stream) {
//			reader = new BufferedReader(new InputStreamReader(stream));
//			st = null;
//		}
//
//		public String next() {
//			while (st == null || !st.hasMoreTokens()) {
//				try {
//					String line = reader.readLine();
//					if (line == null)
//						return null;
//					st = new StringTokenizer(line);
//				} catch (Exception e) {
//					throw (new RuntimeException());
//				}
//			}
//			return st.nextToken();
//		}
//
//		public int nextInt() {
//			return Integer.parseInt(next());
//		}
//
//		public long nextLong() {
//			return Long.parseLong(next());
//		}
//
//		public double nextDouble() {
//			return Double.parseDouble(next());
//		}
//	}

}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Contest {
	private static PrintWriter out = new PrintWriter(System.out);
	private static int n, m, k, tc;
	private static char[][] a;
	private static int[][] grid;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();

		// Incorrect tree
		if(n < 8) {
			out.println(-1);
		} else {
			out.println(1 + " " + 2);
			out.println(1 + " " + 3);
			for(int i = 4;i < n;i++) {
				out.println((i - 2) + " " + (i));
			}
			if(n % 2 == 0)
				out.println((n/2) + " " + n);
			else
				out.println((n - 2) + " " + n);
		}

		// Correct tree
		for (int i = 2; i <= n; i++) {
			out.println(1 + " " + i);
		}

		out.flush();
	}

	private static void sort(int[] a, int n) {
		ArrayList<Integer> b = new ArrayList<Integer>();
		for (int i = 0; i < n; i++)
			b.add(a[i]);
		Collections.sort(b);
		for (int i = 0; i < n; i++)
			a[i] = b.get(i);
	}

	static final Random random = new Random();

	static void ruffleSort(int[] a) {
		int n = a.length;// shuffle, then sort
		for (int i = 0; i < n; i++) {
			int oi = random.nextInt(n), temp = a[oi];
			a[oi] = a[i];
			a[i] = temp;
		}
		java.util.Arrays.sort(a);
	}

//	private static class Scanner {
//		public BufferedReader reader;
//		public StringTokenizer st;
//
//		public Scanner(InputStream stream) {
//			reader = new BufferedReader(new InputStreamReader(stream));
//			st = null;
//		}
//
//		public String next() {
//			while (st == null || !st.hasMoreTokens()) {
//				try {
//					String line = reader.readLine();
//					if (line == null)
//						return null;
//					st = new StringTokenizer(line);
//				} catch (Exception e) {
//					throw (new RuntimeException());
//				}
//			}
//			return st.nextToken();
//		}
//
//		public int nextInt() {
//			return Integer.parseInt(next());
//		}
//
//		public long nextLong() {
//			return Long.parseLong(next());
//		}
//
//		public double nextDouble() {
//			return Double.parseDouble(next());
//		}
//	}

}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Contest {
	private static PrintWriter out = new PrintWriter(System.out);
	private static int n, m, k, tc;
	private static char[][] a;
	private static int[][] grid;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();

		// Incorrect tree
		if(n < 8) {
			out.println(-1);
		} else {
			out.println(1 + " " + 2);
			out.println(1 + " " + 3);
			for(int i = 4;i <= n;i++) {
				out.println((i - 2) + " " + (i));
			}
		}

		// Correct tree
		for (int i = 2; i <= n; i++) {
			out.println(1 + " " + i);
		}

		out.flush();
	}

	private static void sort(int[] a, int n) {
		ArrayList<Integer> b = new ArrayList<Integer>();
		for (int i = 0; i < n; i++)
			b.add(a[i]);
		Collections.sort(b);
		for (int i = 0; i < n; i++)
			a[i] = b.get(i);
	}

	static final Random random = new Random();

	static void ruffleSort(int[] a) {
		int n = a.length;// shuffle, then sort
		for (int i = 0; i < n; i++) {
			int oi = random.nextInt(n), temp = a[oi];
			a[oi] = a[i];
			a[i] = temp;
		}
		java.util.Arrays.sort(a);
	}

//	private static class Scanner {
//		public BufferedReader reader;
//		public StringTokenizer st;
//
//		public Scanner(InputStream stream) {
//			reader = new BufferedReader(new InputStreamReader(stream));
//			st = null;
//		}
//
//		public String next() {
//			while (st == null || !st.hasMoreTokens()) {
//				try {
//					String line = reader.readLine();
//					if (line == null)
//						return null;
//					st = new StringTokenizer(line);
//				} catch (Exception e) {
//					throw (new RuntimeException());
//				}
//			}
//			return st.nextToken();
//		}
//
//		public int nextInt() {
//			return Integer.parseInt(next());
//		}
//
//		public long nextLong() {
//			return Long.parseLong(next());
//		}
//
//		public double nextDouble() {
//			return Double.parseDouble(next());
//		}
//	}

}


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Random;
import java.util.Scanner;
import java.util.StringTokenizer;

public class Contest {
	private static PrintWriter out = new PrintWriter(System.out);
	private static int n, m, k, tc;
	private static char[][] a;
	private static int[][] grid;

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();

		// Incorrect tree
		if(n < 6) {
			out.println(-1);
		} else {
			out.println(1 + " " + 2);
			out.println(1 + " " + 3);
			out.println(1 + " " + 4);
			for(int i = 4;i <= n;i+=3) {
				for(int j = i  + 1;j <= i + 3 && j <= n;j++) {
					out.println(i + " " + j);
				}
			}
		}

		// Correct tree
		for (int i = 2; i <= n; i++) {
			out.println(1 + " " + i);
		}

		out.flush();
	}

	private static void sort(int[] a, int n) {
		ArrayList<Integer> b = new ArrayList<Integer>();
		for (int i = 0; i < n; i++)
			b.add(a[i]);
		Collections.sort(b);
		for (int i = 0; i < n; i++)
			a[i] = b.get(i);
	}

	static final Random random = new Random();

	static void ruffleSort(int[] a) {
		int n = a.length;// shuffle, then sort
		for (int i = 0; i < n; i++) {
			int oi = random.nextInt(n), temp = a[oi];
			a[oi] = a[i];
			a[i] = temp;
		}
		java.util.Arrays.sort(a);
	}

//	private static class Scanner {
//		public BufferedReader reader;
//		public StringTokenizer st;
//
//		public Scanner(InputStream stream) {
//			reader = new BufferedReader(new InputStreamReader(stream));
//			st = null;
//		}
//
//		public String next() {
//			while (st == null || !st.hasMoreTokens()) {
//				try {
//					String line = reader.readLine();
//					if (line == null)
//						return null;
//					st = new StringTokenizer(line);
//				} catch (Exception e) {
//					throw (new RuntimeException());
//				}
//			}
//			return st.nextToken();
//		}
//
//		public int nextInt() {
//			return Integer.parseInt(next());
//		}
//
//		public long nextLong() {
//			return Long.parseLong(next());
//		}
//
//		public double nextDouble() {
//			return Double.parseDouble(next());
//		}
//	}

}


#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define ms(x,a) memset(x,a,sizeof(x))
#define vc vector
#define pb(x) push_back(x)
#define debug cout<<"***"<<endl
#define sd(x) scanf("%d",&x)
#define sdd(x,y) scanf("%d%d",&x,&y)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld%lld",&x,&y)
#define pd(x) printf("%d\n",x)
#define pl(x) printf("%lld\n",x)
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int maxn = 2e3 + 10;
const ll mod = 1e9 + 7;
int n,m,a[maxn];
char ss[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    if(n < 6){
    	cout<<"-1"<<endl;
    	for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
	else {
		cout<<"1 2"<<endl;
		cout<<"1 3"<<endl;
		cout<<"2 4"<<endl;
		cout<<"2 5"<<endl;
		for(int i = 6;i <= n;i++)cout<<"1 "<<i<<endl;
		for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
    return 0;
}


#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define ms(x,a) memset(x,a,sizeof(x))
#define vc vector
#define pb(x) push_back(x)
#define debug cout<<"***"<<endl
#define sd(x) scanf("%d",&x)
#define sdd(x,y) scanf("%d%d",&x,&y)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld%lld",&x,&y)
#define pd(x) printf("%d\n",x)
#define pl(x) printf("%lld\n",x)
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int maxn = 2e3 + 10;
const ll mod = 1e9 + 7;
int n,m,a[maxn];
char ss[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    if(n < 8){
    	cout<<"-1"<<endl;
    	for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
	else {
		cout<<"1 2"<<endl;
		cout<<"1 3"<<endl;
		cout<<"2 4"<<endl;
		cout<<"2 5"<<endl;
		cout<<"3 6"<<endl;
		cout<<"4 7"<<endl;
		cout<<"4 8"<<endl;
		for(int i = 8;i < n;i++){
			if(i == 8)cout<<"6 "<<i + 1<<endl;
			else cout<<i<<" "<<i + 1<<endl;
		}
		for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
    return 0;
}


#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define ms(x,a) memset(x,a,sizeof(x))
#define vc vector
#define pb(x) push_back(x)
#define debug cout<<"***"<<endl
#define sd(x) scanf("%d",&x)
#define sdd(x,y) scanf("%d%d",&x,&y)
#define sl(x) scanf("%lld",&x)
#define sll(x,y) scanf("%lld%lld",&x,&y)
#define pd(x) printf("%d\n",x)
#define pl(x) printf("%lld\n",x)
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int maxn = 2e3 + 10;
const ll mod = 1e9 + 7;
int n,m,a[maxn];
char ss[maxn];

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    if(n < 8){
    	cout<<"-1"<<endl;
    	for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
	else {
		cout<<"1 2"<<endl;
		cout<<"1 3"<<endl;
		cout<<"2 4"<<endl;
		cout<<"2 5"<<endl;
		cout<<"3 6"<<endl;
		cout<<"4 7"<<endl;
		cout<<"4 8"<<endl;
		for(int i = 8;i < n;i++){
			if(i == 8)cout<<"8 "<<i + 1<<endl;
			else cout<<i<<" "<<i + 1<<endl;
		}
		for(int i = 1;i < n;i++){
    		cout<<i<<" "<<i + 1<<endl;
		}
	}
    return 0;
}


/*   786     */

#include <bits/stdc++.h>
using namespace std;
//typedefs
typedef long long LL;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
typedef pair<LL, LL> PLL;
typedef vector<PII> VII;
typedef vector<PLL> VLL;

//#Defines
#define rep(i,a,b)	for(i=a;i<=b;i++)
#define repR(i,a,b)	for(i=a;i>=b;i--)
#define pb push_back
// #define pb emplace_back
#define F first
#define S second
#define mp make_pair
#define all(c)		c.begin(),c.end()
#define endl '\n'
#define pf(x) printf("%d",x)
#define pfl(x) printf("%lld",x)
#define sf(x) scanf("%d",&x)
#define sfl(x) scanf("%lld",&x)
#define MOD 1000000007
#define trace(x) cerr << #x << ": " << x << " " << endl;

int main()
{
    LL i,j,k,l,m,n;
    cin>>n;

    if(n==2)
    {
        cout<<-1<<endl;
        cout<<1<<" "<<2<<endl;
        return 0;
    }
    if(n>=6){
    for(i=2;i<=n-2;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
    }
    else cout<<-1<<endl;

    for(i=2;i<=n-1;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
}


/*   786     */

#include <bits/stdc++.h>
using namespace std;
//typedefs
typedef long long LL;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
typedef pair<LL, LL> PLL;
typedef vector<PII> VII;
typedef vector<PLL> VLL;

//#Defines
#define rep(i,a,b)	for(i=a;i<=b;i++)
#define repR(i,a,b)	for(i=a;i>=b;i--)
#define pb push_back
// #define pb emplace_back
#define F first
#define S second
#define mp make_pair
#define all(c)		c.begin(),c.end()
#define endl '\n'
#define pf(x) printf("%d",x)
#define pfl(x) printf("%lld",x)
#define sf(x) scanf("%d",&x)
#define sfl(x) scanf("%lld",&x)
#define MOD 1000000007
#define trace(x) cerr << #x << ": " << x << " " << endl;

int main()
{
    LL i,j,k,l,m,n;
    cin>>n;
    if(n==4)
    {
        cout<<1<<" "<<2<<endl<<1<<" "<<3<<endl<<2<<" "<<4<<endl;

        cout<<1<<" "<<2<<endl<<2<<" "<<3<<endl<<2<<" "<<4<<endl;
        return 0;
    }
    if(n==2)
    {
        cout<<-1<<endl;
        cout<<1<<" "<<2<<endl;
        return 0;
    }
    if(n>=5){
    for(i=2;i<=n-2;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
    }
    else cout<<-1<<endl;

    for(i=2;i<=n-1;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
}


/*   786     */

#include <bits/stdc++.h>
using namespace std;
//typedefs
typedef long long LL;
typedef vector<int> VI;
typedef vector<LL> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> PII;
typedef pair<double, double> PDD;
typedef pair<LL, LL> PLL;
typedef vector<PII> VII;
typedef vector<PLL> VLL;

//#Defines
#define rep(i,a,b)	for(i=a;i<=b;i++)
#define repR(i,a,b)	for(i=a;i>=b;i--)
#define pb push_back
// #define pb emplace_back
#define F first
#define S second
#define mp make_pair
#define all(c)		c.begin(),c.end()
#define endl '\n'
#define pf(x) printf("%d",x)
#define pfl(x) printf("%lld",x)
#define sf(x) scanf("%d",&x)
#define sfl(x) scanf("%lld",&x)
#define MOD 1000000007
#define trace(x) cerr << #x << ": " << x << " " << endl;

int main()
{
    LL i,j,k,l,m,n;
    cin>>n;

    if(n==2)
    {
        cout<<-1<<endl;
        cout<<1<<" "<<2<<endl;
        return 0;
    }
    if(n>=5){
    for(i=2;i<=n-2;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
    }
    else cout<<-1<<endl;

    for(i=2;i<=n-1;i++)cout<<1<<" "<<i<<endl;
    for(j=i;j<=n;j++)cout<<2<<" "<<j<<endl;
}


#include <iostream>
#include <vector>
using namespace std;
int main(){
  int n; cin >> n;
  int x = n / 2 + 1;
  if(n < 3){
    cout << -1 << endl;
    goto end;
  }
  for(int i = 2; i < x; i++){
    cout << 1 << ' ' << i << endl;
  }
  for(int i = x; i < n; i++){
    cout << 2 << ' ' << i << endl;
  }
  cout << 1 << ' ' << n << endl;
  end:
    for(int i = 1; i < n; i++){
      cout << 1 << ' ' << i + 1 << endl;
    }
  return 0;
}


#include <iostream>
#include <vector>
using namespace std;
int main(){
  int n; cin >> n;
  int x = n / 2;
  if(n < 3){
    cout << -1 << endl;
    goto end;
  }
  for(int i = 2; i < x; i++){
    cout << 1 << ' ' << i << endl;
  }
  for(int i = x; i < n; i++){
    cout << 2 << ' ' << i << endl;
  }
  end:
    for(int i = 1; i < n; i++){
      cout << i << ' ' << i + 1 << endl;
    }
  return 0;
}


#include <iostream>
#include <vector>
using namespace std;
int main(){
  int n; cin >> n;
  int x = n / 2 + 1;
  if(n < 5){
    cout << -1 << endl;
    goto end;
  }
  for(int i = 2; i < x; i++){
    cout << 1 << ' ' << i << endl;
  }
  for(int i = x; i < n; i++){
    cout << 2 << ' ' << i << endl;
  }
  cout << 1 << ' ' << n << endl;
  end:
    for(int i = 1; i < n; i++){
      cout << 1 << ' ' << i + 1 << endl;
    }
  return 0;
}


#include <iostream>
#include <vector>
using namespace std;
int main(){
  int n; cin >> n;
  int x = n / 2 + 1;
  if(n < 6){
    cout << -1 << endl;
    goto end;
  }
  for(int i = 2; i < x; i++){
    cout << 1 << ' ' << i << endl;
  }
  for(int i = x; i < n; i++){
    cout << 2 << ' ' << i << endl;
  }
  cout << 1 << ' ' << n << endl;
  end:
    for(int i = 1; i < n; i++){
      cout << 1 << ' ' << i + 1 << endl;
    }
  return 0;
}


// https://codeforces.com/problemset/problem/959/C

/* algorithm for problem solution:......

for incorrect ans:
    case 1:
        if node number is <= 5 ans doesn't exist..
    case 2: here always answer exist...
        (1)
       / \  \
     (2) (3) (4)
    /
   (5....n)

for correct ans:
    1>  all  node/vertex  connected  with  root.....

*/
// source code:
/*...Bismillahir Rahmanir Rahim...*/
#include <bits/stdc++.h>
using namespace std;

/*........print part.........*/
template <typename T> inline void printl(T a,char c='\n'){ cout<<a<<c; }
template <typename T> inline void print(T a,char c=' '){ cout<<a<<c; }
template <typename T1,typename T2> inline void print(T1 a,T2 b){ cout<<a<<" "<<b<<endl; }

/*........define part........*/
#define  ff         first
#define  ss         second
#define  mod        1000000007
#define  ll         long long
#define  int        long long
#define  i64        __int64
#define  gcd(a,b)   __gcd(a,b)
#define  lcm(a,b)   (a*b)/gcd(a,b)
#define  pb         push_back
#define  pf         push_front
#define  sz(a)      (int)a.size()
#define  pii        pair<int, int>
#define  all(v)     v.begin(),v.end()
#define  forn(i,n)  for (int i=0;i<n;i++)
#define  for1(i,n)  for (int i=1;i<=n;i++)
#define  dbg(x)     cerr << #x << " = " << x << '\n'
#define  mset(a,v)  memset(a,v,sizeof(a));
#define  fast_io    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define  file_in    freopen("input.txt", "r", stdin);
#define  file_out   freopen("output.txt", "w", stdout);
#define  t_casout1  int n=1;while (n--) solve();
#define  t_casout   int n;cin>>n;while (n--) solve();
#define  t_casein   int n;cin>>n;while (n--)
#define  ok(n)      puts(n>0?"YES":"NO");
#define  pi         acos(-1)
#define  vi         vector <int>
#define  endl       '\n'

///===============================  (template)  ==========================================

inline void solve(){
    int n; cin>>n;
    if (n<6) printl(-1);
    else {
        print(1,2);
        print(1,3);
        print(1,4);
        for (int i=5;i<=n;i++) print(2,i);
    }
    for (int i=2;i<=n;i++) print(1,i);
}

signed main()
{
    fast_io;
    t_casout1 ;
    return 0;
}


// https://codeforces.com/problemset/problem/959/C

/* algorithm for problem solution:......

for incorrect ans:
    case 1:
        if node number is <= 5 ans doesn't exist..
    case 2: here always answer exist...
                 tree        depth
                -----        ------
                 (1)   ---->   0
               /  |  \
             (2) (3) (4) -->   1
            /
           (5....n) ------->   2

for correct ans:
    1>  all  node/vertex  connected  with  root.....

*/
// source code:
/*...Bismillahir Rahmanir Rahim...*/
#include <bits/stdc++.h>
using namespace std;

/*........print part.........*/
template <typename T> inline void printl(T a,char c='\n'){ cout<<a<<c; }
template <typename T> inline void print(T a,char c=' '){ cout<<a<<c; }
template <typename T1,typename T2> inline void print(T1 a,T2 b){ cout<<a<<" "<<b<<endl; }

/*........define part........*/
#define  ff         first
#define  ss         second
#define  mod        1000000007
#define  ll         long long
#define  int        long long
#define  i64        __int64
#define  gcd(a,b)   __gcd(a,b)
#define  lcm(a,b)   (a*b)/gcd(a,b)
#define  pb         push_back
#define  pf         push_front
#define  sz(a)      (int)a.size()
#define  pii        pair<int, int>
#define  all(v)     v.begin(),v.end()
#define  forn(i,n)  for (int i=0;i<n;i++)
#define  for1(i,n)  for (int i=1;i<=n;i++)
#define  dbg(x)     cerr << #x << " = " << x << '\n'
#define  mset(a,v)  memset(a,v,sizeof(a));
#define  fast_io    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define  file_in    freopen("input.txt", "r", stdin);
#define  file_out   freopen("output.txt", "w", stdout);
#define  t_casout1  int n=1;while (n--) solve();
#define  t_casout   int n;cin>>n;while (n--) solve();
#define  t_casein   int n;cin>>n;while (n--)
#define  ok(n)      puts(n>0?"YES":"NO");
#define  pi         acos(-1)
#define  vi         vector <int>
#define  endl       '\n'

///===============================  (template)  ==========================================

inline void solve(){
    int n; cin>>n;
    if (n<6) printl(-1);
    else {
        print(1,2);
        print(1,3);
        print(1,4);
        for (int i=5;i<=n;i++) print(2,i);
    }
    for (int i=2;i<=n;i++) print(1,i);
}

signed main()
{
    fast_io;
    t_casout1 ;
    return 0;
}


// https://codeforces.com/problemset/problem/959/C

/* algorithm for problem solution:......

for incorrect ans:
    case 1:
        if node number is <= 7 ans doesn't exist..
    case 2: here always answer exist...
        (1)
       /   \
     (2)   (3)
    /  \    \
   (4) (5)   (6)
  /  \
 (7,8,9.....n)

for correct ans:
    1>  all  node/vertex  connected  with  root.....

*/
// source code:
/*...Bismillahir Rahmanir Rahim...*/
#include <bits/stdc++.h>
using namespace std;

/*........print part.........*/
template <typename T> inline void printl(T a,char c='\n'){ cout<<a<<c; }
template <typename T> inline void print(T a,char c=' '){ cout<<a<<c; }
template <typename T1,typename T2> inline void print(T1 a,T2 b){ cout<<a<<" "<<b<<endl; }

/*........define part........*/
#define  ff         first
#define  ss         second
#define  mod        1000000007
#define  ll         long long
#define  int        long long
#define  i64        __int64
#define  gcd(a,b)   __gcd(a,b)
#define  lcm(a,b)   (a*b)/gcd(a,b)
#define  pb         push_back
#define  pf         push_front
#define  sz(a)      (int)a.size()
#define  pii        pair<int, int>
#define  all(v)     v.begin(),v.end()
#define  forn(i,n)  for (int i=0;i<n;i++)
#define  for1(i,n)  for (int i=1;i<=n;i++)
#define  dbg(x)     cerr << #x << " = " << x << '\n'
#define  mset(a,v)  memset(a,v,sizeof(a));
#define  fast_io    ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define  file_in    freopen("input.txt", "r", stdin);
#define  file_out   freopen("output.txt", "w", stdout);
#define  t_casout1  int n=1;while (n--) solve();
#define  t_casout   int n;cin>>n;while (n--) solve();
#define  t_casein   int n;cin>>n;while (n--)
#define  ok(n)      puts(n>0?"YES":"NO");
#define  pi         acos(-1)
#define  vi         vector <int>
#define  endl       '\n'

///===============================  (template)  ==========================================

inline void solve(){
    int n;
    cin>>n;
    if (n<8) printl(-1);
    else {
        print(1,2);
        print(1,3);
        print(2,4);
        print(2,5);
        print(3,6);
        for (int i=7;i<=n;i++) print(4,i);
    }
    for (int i=2;i<=n;i++) print(1,i);
}

signed main()
{
    fast_io;
    t_casout1 ;
    return 0;
}


#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    int n; cin >> n;
    if (n < 8) cout << -1 << endl;
    else{
        cout << "1 1 2 2 3 6 6 ";
        for (int i = 7; i < n; i++) cout << 6 <<" ";
        cout << endl;
    }
    for (int i = 0; i < n; i++) cout << i+1 << " ";
    cout << endl;
}


#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    int n; cin >> n;
    if (n < 6) cout << -1 << endl;
    else{
        cout << "1 2"<<endl;
        cout << "2 3"<<endl;
        cout << "2 4"<<endl;
        cout << "4 5"<<endl;
        cout << "4 6"<<endl;
        for (int i = 7; i <= n; i++) cout << "4 7"<<"\n";
    }
    for (int i = 0; i < n - 1; i++) cout << i+1 << " " <<i+2<<"\n";
    cout << endl;
}


#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    int n; cin >> n;
    if (n < 6) cout << -1 << endl;
    else{
        cout << "1 2"<<endl;
        cout << "2 3"<<endl;
        cout << "2 4"<<endl;
        cout << "4 5"<<endl;
        cout << "4 6"<<endl;
        for (int i = 7; i <= n; i++) cout << "4 "<<i<<"\n";
    }
    for (int i = 0; i < n - 1; i++) cout << i+1 << " " <<i+2<<"\n";

}


#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
int main(){
    int n; cin >> n;
    if (n < 6) cout << -1 << endl;
    else{
        cout << "1 2"<<endl;
        cout << "2 3"<<endl;
        cout << "2 4"<<endl;
        cout << "4 5"<<endl;
        cout << "4 6"<<endl;
        for (int i = 7; i <= n; i++) cout << "4 7"<<"\n";
    }
    for (int i = 0; i < n; i++) cout << i+1 << " " <<i+2<<"\n";

}


/*---> 10 January 2020 <--- > 06:06:10 <---*/
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
// #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//#pragma GCC target ("sse4")
#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
//template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
#define int long long
#define F first
#define S second
#define mod 1000000007
#define inf (int)1e18+5
#define sz(x) (int)x.size()
#define PI 3.141592653589793238510
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define __ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define vi vector<int>
#define vpii vector<pair<int,int> >
#define vvi vector<vector<int> >
#define PRINT_TIME cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s." <<endl;
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename   enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
typedef long double ld;
typedef pair<int,int> pii;
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
const int N=1e5+5;

int32_t main(){__
	int n;
	cin>>n;
	if(n<=4){
		cout<<-1<<"\n";
	}
	else{
		for(int i=1;i<=n-1;i++)
			cout<<i<<" "<<i+1<<"\n";
	}
	//Correct
	for(int i=2;i<=n;i++)
		cout<<1<<" "<<i<<"\n";
return 0;
}


/*---> 10 January 2020 <--- > 06:06:10 <---*/
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
// #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//#pragma GCC target ("sse4")
#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
//template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
#define int long long
#define F first
#define S second
#define mod 1000000007
#define inf (int)1e18+5
#define sz(x) (int)x.size()
#define PI 3.141592653589793238510
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define __ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define vi vector<int>
#define vpii vector<pair<int,int> >
#define vvi vector<vector<int> >
#define PRINT_TIME cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s." <<endl;
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename   enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
typedef long double ld;
typedef pair<int,int> pii;
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
const int N=1e5+5;

int32_t main(){__
	int n;
	cin>>n;
	if(n<8){
		cout<<-1<<"\n";
	}
	else{
		cout<<1<<" "<<3<<"\n";
		cout<<3<<" "<<6<<"\n";
		cout<<2<<" "<<1<<"\n";
		cout<<2<<" "<<4<<"\n";
		cout<<2<<" "<<5<<"\n";
		for(int i=7;i<=n;i++){
			cout<<4<<" "<<i<<"\n";
		}
	}
	//Correct
	for(int i=2;i<=n;i++)
		cout<<1<<" "<<i<<"\n";
return 0;
}


/*---> 10 January 2020 <--- > 06:06:10 <---*/
// #pragma GCC optimize("Ofast")
// #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
// #pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("O3")
//#pragma GCC target ("sse4")
#include <bits/stdc++.h>
//#include <ext/pb_ds/tree_policy.hpp>
//#include <ext/pb_ds/assoc_container.hpp>
//using namespace __gnu_pbds;
using namespace std;
//template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
#define int long long
#define F first
#define S second
#define mod 1000000007
#define inf (int)1e18+5
#define sz(x) (int)x.size()
#define PI 3.141592653589793238510
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define __ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define vi vector<int>
#define vpii vector<pair<int,int> >
#define vvi vector<vector<int> >
#define PRINT_TIME cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s." <<endl;
#define sim template < class c
#define ris return * this
#define dor > debug & operator <<
#define eni(x) sim > typename   enable_if<sizeof dud<c>(0) x 1, debug&>::type operator<<(c i) {
sim > struct rge { c b, e; };
sim > rge<c> range(c i, c j) { return rge<c>{i, j}; }
sim > auto dud(c* x) -> decltype(cerr << *x, 0);
sim > char dud(...);
struct debug {
#ifdef LOCAL
~debug() { cerr << endl; }
eni(!=) cerr << boolalpha << i; ris; }
eni(==) ris << range(begin(i), end(i)); }
sim, class b dor(pair < b, c > d) {
  ris << "(" << d.first << ", " << d.second << ")";
}
sim dor(rge<c> d) {
  *this << "[";
  for (auto it = d.b; it != d.e; ++it)
    *this << ", " + 2 * (it == d.b) << *it;
  ris << "]";
}
#else
sim dor(const c&) { ris; }
#endif
};
#define imie(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
typedef long double ld;
typedef pair<int,int> pii;
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
const int N=1e5+5;

int32_t main(){__
	int n;
	cin>>n;
	if(n<=5){
		cout<<-1<<"\n";
	}
	else{
		cout<<1<<" "<<4<<"\n";
		cout<<1<<" "<<3<<"\n";
		cout<<1<<" "<<2<<"\n";
		for(int i=5;i<=n;i++)
			cout<<2<<" "<<i<<"\n";
	}
	//Correct
	for(int i=2;i<=n;i++)
		cout<<1<<" "<<i<<"\n";
return 0;
}


#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
#define all(i,a) for(auto i=a.begin();i!=a.end();++i)
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
const db pi=3.1415926535;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}
    while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}
    return s*w;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
int gcd(int a, int b){
	if(a==0) return b;
	if(b==0) return a;
	if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;
	else if(!(b&1)) return gcd(a,b>>1);
	else if(!(a&1)) return gcd(a>>1,b);
	else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}

int n;

void gao1(){
	if(n==4||n==5){
		cout<<-1;
		return;
	}
	cout<<1<<' '<<2<<endl;
	cout<<1<<' '<<3<<endl;
	cout<<1<<' '<<4<<endl;
	re(i,5,n) cout<<4<<' '<<i<<endl;
}

void gao2(){
	re(i,2,n)
		cout<<1<<' '<<i<<endl;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    if(n==2){
		cout<<-1<<endl;
		cout<<1<<' '<<2;
		return 0;
	}
	else if(n==3){
		cout<<-1<<endl;
		cout<<1<<' '<<2<<endl;
		cout<<2<<' '<<3;
		return 0;
	}
	gao1();
	gao2();
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
#define all(i,a) for(auto i=a.begin();i!=a.end();++i)
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
const db pi=3.1415926535;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}
    while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}
    return s*w;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
int gcd(int a, int b){
	if(a==0) return b;
	if(b==0) return a;
	if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;
	else if(!(b&1)) return gcd(a,b>>1);
	else if(!(a&1)) return gcd(a>>1,b);
	else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}

int n;

void gao1(){
	if(n==4||n==5){
		cout<<-1;
		return;
	}
	cout<<1<<' '<<2<<endl;
	cout<<1<<' '<<3<<endl;
	cout<<1<<' '<<4<<endl;
	re(i,5,n) cout<<4<<' '<<i<<endl;
}

void gao2(){
	re(i,2,n)
		cout<<1<<' '<<i<<endl;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    if(n==2){
		cout<<-1<<endl;
		cout<<1<<' '<<2;
		return 0;
	}
	else if(n==3){
		cout<<-1<<endl;
		cout<<1<<' '<<2;
		cout<<2<<' '<<3;
		return 0;
	}
	gao1();
	gao2();
    return 0;
}


#include <bits/stdc++.h>
#define int long long
#define sc(a) scanf("%lld",&a)
#define scc(a,b) scanf("%lld %lld",&a,&b)
#define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
#define scs(a) scanf("%s",a)
#define schar(a) scanf("%c",&a)
#define pr(a) printf("%lld",a)
#define fo(i,a,b) for(int i=a;i<b;++i)
#define re(i,a,b) for(int i=a;i<=b;++i)
#define rfo(i,a,b) for(int i=a;i>b;--i)
#define rre(i,a,b) for(int i=a;i>=b;--i)
#define prn() printf("\n")
#define prs() printf(" ")
#define mkp make_pair
#define pii pair<int,int>
#define pub(a) push_back(a)
#define pob() pop_back()
#define puf(a) push_front(a)
#define pof() pop_front()
#define fst first
#define snd second
#define frt front()
#define bak back()
#define mem0(a) memset(a,0,sizeof(a))
#define memmx(a) memset(a,0x3f3f,sizeof(a))
#define memmn(a) memset(a,-0x3f3f,sizeof(a))
#define debug
#define db double
#define yyes cout<<"YES"<<endl;
#define nno cout<<"NO"<<endl;
#define all(i,a) for(auto i=a.begin();i!=a.end();++i)
using namespace std;
typedef vector<int> vei;
typedef vector<pii> vep;
typedef map<int,int> mpii;
typedef map<char,int> mpci;
typedef map<string,int> mpsi;
typedef deque<int> deqi;
typedef deque<char> deqc;
typedef priority_queue<int> mxpq;
typedef priority_queue<int,vector<int>,greater<int> > mnpq;
typedef priority_queue<pii> mxpqii;
typedef priority_queue<pii,vector<pii>,greater<pii> > mnpqii;
const int maxn=500005;
const int inf=0x3f3f3f3f3f3f3f3f;
const int MOD=100000007;
const db eps=1e-10;
const db pi=3.1415926535;
int qpow(int a,int b){int tmp=a%MOD,ans=1;while(b){if(b&1){ans*=tmp,ans%=MOD;}tmp*=tmp,tmp%=MOD,b>>=1;}return ans;}
int lowbit(int x){return x&-x;}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int mmax(int a,int b,int c){return max(a,max(b,c));}
int mmin(int a,int b,int c){return min(a,min(b,c));}
void mod(int &a){a+=MOD;a%=MOD;}
bool chk(int now){}
int half(int l,int r){while(l<=r){int m=(l+r)/2;if(chk(m))r=m-1;else l=m+1;}return l;}
int ll(int p){return p<<1;}
int rr(int p){return p<<1|1;}
int mm(int l,int r){return (l+r)/2;}
int lg(int x){if(x==0) return 1;return (int)log2(x)+1;}
bool smleql(db a,db b){if(a<b||fabs(a-b)<=eps)return true;return false;}
bool bigeql(db a,db b){if(a>b||fabs(a-b)<=eps)return true;return false;}
bool eql(db a,db b){if(fabs(a-b)<eps) return 1;return 0;}
db len(db a,db b,db c,db d){return sqrt((a-c)*(a-c)+(b-d)*(b-d));}
bool isp(int x){if(x==1)return false;if(x==2)return true;for(int i=2;i*i<=x;++i)if(x%i==0)return false;return true;}
inline int read(){
    char ch=getchar();int s=0,w=1;
    while(ch<48||ch>57){if(ch=='-')w=-1;ch=getchar();}
    while(ch>=48&&ch<=57){s=(s<<1)+(s<<3)+ch-48;ch=getchar();}
    return s*w;
}
inline void write(int x){
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+48);
}
int gcd(int a, int b){
	if(a==0) return b;
	if(b==0) return a;
	if(!(a&1)&&!(b&1)) return gcd(a>>1,b>>1)<<1;
	else if(!(b&1)) return gcd(a,b>>1);
	else if(!(a&1)) return gcd(a>>1,b);
	else return gcd(abs(a-b),min(a,b));
}
int lcm(int x,int y){return x*y/gcd(x,y);}

int n;

void gao1(){
	if(n==4||n==5){
		cout<<-1<<endl;
		return;
	}
	cout<<1<<' '<<2<<endl;
	cout<<1<<' '<<3<<endl;
	cout<<1<<' '<<4<<endl;
	re(i,5,n) cout<<4<<' '<<i<<endl;
}

void gao2(){
	re(i,2,n)
		cout<<1<<' '<<i<<endl;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    if(n==2){
		cout<<-1<<endl;
		cout<<1<<' '<<2;
		return 0;
	}
	else if(n==3){
		cout<<-1<<endl;
		cout<<1<<' '<<2<<endl;
		cout<<2<<' '<<3;
		return 0;
	}
	gao1();
	gao2();
    return 0;
}


#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define ret( a ) return cout << (a) << endl , 0 ;
#define all(i) i.begin(),i.end()
#define fix(i) fixed<<setprecision((i))
#define smax( i , j ) (i)=max((i),(j))
#define smin( i , j ) (i)=min((i),(j))
#define pii pair< int , int >
#define vec vector< int >

using namespace std;

const long long maxn = 1e9;
const long long INF = 3e18+1191;
const long long mod = 1e9+7;

int n;
vector<pair<int,int> > ans;

int32_t main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	if (n <= 5) cout << -1 << endl;
	else {
		cout << 1 << ' ' << 2 << endl;
		cout << 1 << ' ' << 3 << endl;
		cout << 1 << ' ' << 4 << endl;
		for (int i = 5; i <= n; i++)
			cout << 2 << ' ' << i << endl;
	}
	for ( int i = 1; i < n; i++)
		cout << 1 << ' ' << i << endl;

}


#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define ret( a ) return cout << (a) << endl , 0 ;
#define all(i) i.begin(),i.end()
#define fix(i) fixed<<setprecision((i))
#define smax( i , j ) (i)=max((i),(j))
#define smin( i , j ) (i)=min((i),(j))
#define pii pair< int , int >
#define vec vector< int >

using namespace std;

const long long maxn = 1e9;
const long long INF = 3e18+1191;
const long long mod = 1e9+7;

int n;
vector<pair<int,int> > ans;

int32_t main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	if (n <= 5) cout << -1 << endl;
	else {
		cout << 1 << ' ' << 2 << endl;
		cout << 1 << ' ' << 3 << endl;
		cout << 1 << ' ' << 4 << endl;
		for (int i = 5; i <= n; i++)
			cout << 2 << ' ' << i << endl;
	}
	for ( int i = 1; i < n; i++)
		cout << 1 << ' ' << i+1 << endl;

}


#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define ret( a ) return cout << (a) << endl , 0 ;
#define all(i) i.begin(),i.end()
#define fix(i) fixed<<setprecision((i))
#define smax( i , j ) (i)=max((i),(j))
#define smin( i , j ) (i)=min((i),(j))
#define pii pair< int , int >
#define vec vector< int >

using namespace std;

const long long maxn = 1e9;
const long long INF = 3e18+1191;
const long long mod = 1e9+7;

int n;

int32_t main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	if (n == 2) {
		cout << -1 << endl;
		cout << 1 << ' ' << 2 << endl;
		return 0;
	}
	int node = 1;
	while ( 1 ) {

		if(node > n || node*2 > n || node*2+1 > n) break;
		cout << node << ' ' << 2*node << endl;
		cout << node << ' ' << 2*node+1 << endl;
		node ++;
	}
	cout << 1 << ' ' << 2 << endl;
	for ( int i = 3; i <= n; i++)
		cout << 1 << ' ' << i << endl;

}


#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define F first
#define S second
#define ret( a ) return cout << (a) << endl , 0 ;
#define all(i) i.begin(),i.end()
#define fix(i) fixed<<setprecision((i))
#define smax( i , j ) (i)=max((i),(j))
#define smin( i , j ) (i)=min((i),(j))
#define pii pair< int , int >
#define vec vector< int >

using namespace std;

const long long maxn = 1e9;
const long long INF = 3e18+1191;
const long long mod = 1e9+7;

int n;
vector<pair<int,int> > ans;

int32_t main() {
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin >> n;
	if (n == 2) {
		cout << -1 << endl;
		cout << 1 << ' ' << 2 << endl;
		return 0;
	}
	int node = 1;
	int q = n-1;
	while(1) {
		int l = node << 1;
		int r = l ^ 1;

		cout << node << ' ' << l << endl;
		if ( l == n )
			break;
		cout << node << ' ' << r << endl;
		if ( r == n )
			break;
		node ++;
	}
	cout << 1 << ' ' << 2 << endl;
	for ( int i = 3; i <= n; i++)
		cout << 1 << ' ' << i << endl;

}


#include <bits/stdc++.h>

using namespace std;

/********************************************/
#define tie() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define f(i,from,to) for(int i=from;i<to;++i)
#define rev(i,to,from) for(int i=to;i>from;--i)
#define mem(arr,val) memset(arr , val , sizeof arr)
#define all(v) v.begin(),v.end()
#define ff first
#define ss second
#define mp make_pair
#define pb push_back

typedef long long int ll;
const int sz = 10002;
const int INF = 1e9 + 7;
/******************************************/

class codeforces
{
    public:
    void solve();
};

void codeforces :: solve()
{
    ll n;cin>>n;

    if(n<6)
        cout<<-1<<endl;
    else
    {
        f(i,1,(n+1)/2)
            cout<<1<<" "<<i+1<<endl;
        f(i,(n+1)/2,n)
            cout<<2<<" "<<i+1<<endl;
    }

    f(i,0,n)
    cout<<1<<" "<<i+1<<endl;
}

int main()
{
    tie();
    int T=1;
    //cin>>T;
    while(T--)
    {
        codeforces problem;
        problem.solve();
    }
    return 0;
}


#include <bits/stdc++.h>

using namespace std;

/********************************************/
#define tie() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define f(i,from,to) for(int i=from;i<to;++i)
#define rev(i,to,from) for(int i=to;i>from;--i)
#define mem(arr,val) memset(arr , val , sizeof arr)
#define all(v) v.begin(),v.end()
#define ff first
#define ss second
#define mp make_pair
#define pb push_back

typedef long long int ll;
const int sz = 10002;
const int INF = 1e9 + 7;
/******************************************/

class codeforces
{
    public:
    void solve();
};

void codeforces :: solve()
{
    ll n;cin>>n;

    if(n<6)
        cout<<-1<<endl;
    else
    {
        f(i,1,(n+1)/2)
            cout<<1<<" "<<i+1<<endl;
        f(i,(n+1)/2,n)
            cout<<2<<" "<<i+1<<endl;
    }

    f(i,1,n)
    cout<<1<<" "<<i+1<<endl;
}

int main()
{
    tie();
    int T=1;
    //cin>>T;
    while(T--)
    {
        codeforces problem;
        problem.solve();
    }
    return 0;
}


#include <bits/stdc++.h>

using namespace std;

/********************************************/
#define tie() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define f(i,from,to) for(int i=from;i<to;++i)
#define rev(i,to,from) for(int i=to;i>from;--i)
#define mem(arr,val) memset(arr , val , sizeof arr)
#define all(v) v.begin(),v.end()
#define ff first
#define ss second
#define mp make_pair
#define pb push_back

typedef long long int ll;
const int sz = 10002;
const int INF = 1e9 + 7;
/******************************************/

class codeforces
{
    public:
    void solve();
};

void codeforces :: solve()
{
    ll n;cin>>n;

    if(n<6)
        cout<<-1<<endl;
    else
    {
        int u;
        if(n&1)
        {
            u = (n/2) + 1;
        }
        else
            u = (n/2) + 1;
        f(i,2,u+1)
            cout<<1<<" "<<i<<endl;
        f(i,u+1,n+1)
            cout<<2<<" "<<i<<endl;
    }

    f(i,1,n)
    cout<<1<<" "<<i+1<<endl;
}

int main()
{
    tie();
    int T=1;
    //cin>>T;
    while(T--)
    {
        codeforces problem;
        problem.solve();
    }
    return 0;
}


#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long int

using namespace std;
int main()
{

    //code here
    ll n;
    cin>>n;
    if(n==1)
        cout<<0<<endl;
    else if(n<=5)
        cout<<-1<<endl;
    else
    {
       for(ll i=1;i<n;i++)
        {
            cout<<i<<" "<<i+1<<endl;
        }
    }

    //correcty
    for(ll i=2;i<=n;i++)
        cout<<1<<" "<<i<<endl;

    return 0;
}


#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long int

using namespace std;
int main()
{
    fast;
    //code here
    ll n;
    cin>>n;
    if(n==1)
        cout<<0<<endl;
    else if(n<=5)
        cout<<-1<<endl;
    else
    {
       for(ll i=1;i<n;i++)
        {
            cout<<i<<" "<<i+1<<endl;
        }
    }

    //correcty
    for(ll i=2;i<=n;i++)
        cout<<1<<" "<<i<<endl;

    return 0;
}


#include<bits/stdc++.h>
#define mod 1000000007
#define ll long long int

using namespace std;
int main()
{

    //code here
    ll n;
    cin>>n;
    if(n==1)
        cout<<0<<endl;
    else if(n<=5)
        cout<<-1<<endl;
    else
    {
        cout<<"1 2"<<endl;
        cout<<"2 3"<<endl;
        cout<<"2 4"<<endl;
       for(ll i=5;i<=n;i++)
        {
            cout<<3<<" "<<i<<endl;
        }
    }

    //correcty
    for(ll i=2;i<=n;i++)
        cout<<1<<" "<<i<<endl;

    return 0;
}


#include<bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define MOD (int)1e9+7
#define floop(s,e) for(int i=s;i<e;i++)

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef vector<pair<int,int>> vpii;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<long long> vl;
typedef vector<vector<long long>> vvl;

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    cin>>n;

    if(n<6) cout<<-1<<endl;
    else if(n>=6)
    {
        cout<<"1 2\n1 3\n3 4\n4 5"<<endl;
        for(int i=6;i<=n;i++) cout<<1<<" "<<i<<endl;
    }

    floop(2,n+1) cout<<1<<" "<<i<<endl;
}


#include<bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define MOD (int)1e9+7
#define floop(s,e) for(int i=s;i<e;i++)

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef vector<pair<int,int>> vpii;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<long long> vl;
typedef vector<vector<long long>> vvl;

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    cin>>n;

    if(n<8) cout<<-1<<endl;
    else if(n>=8)
    {
        cout<<"1 2\n2 3\n3 4\n4 5\n4 6"<<endl;
        for(int i=7;i<=n;i++) cout<<1<<" "<<i<<endl;
    }

    floop(2,n+1) cout<<1<<" "<<i<<endl;
}


#include<bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define MOD (int)1e9+7
#define floop(s,e) for(int i=s;i<e;i++)

typedef pair<int,int> pii;
typedef pair<long long,long long> pll;
typedef vector<pair<int,int>> vpii;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<long long> vl;
typedef vector<vector<long long>> vvl;

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int n;
    cin>>n;

    if(n<6) cout<<-1<<endl;
    else if(n>=6)
    {
        cout<<"1 2\n1 3\n3 4\n3 5"<<endl;
        for(int i=6;i<=n;i++) cout<<1<<" "<<i<<endl;
    }

    floop(2,n+1) cout<<1<<" "<<i<<endl;
}


#include <iostream>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;

    if(n < 6) {
        cout << -1 << endl;
    } else {
        cout << 1 << " " << 3 << endl;
	cout << 2 << " " << 3 << endl;
	cout << 3 << " " << 4 << endl;
	for(int i=5; i <= n; i++){
	    cout << 4 << " " << i << endl;
	}
    }

    for(int i=1; i < n; i++){
        cout << i << " " << i+1 << endl;
    }
}


#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    if(n < 6) {
        cout << -1 << endl;
    } else {
        cout << 1 << " " << 3 << endl;
	cout << 2 << " " << 3 << endl;
	cout << 3 << " " << 4 << endl;
	for(int i=5; i <= n; i++){
	    cout << 4 << " " << i << endl;
	}
    }

    for(int i=1; i < n; i++){
        cout << i << " " << i+1 << endl;
    }
}


#include <bits/stdc++.h>

using namespace std;
#define ll long long
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;

int main() {
    int n;
    cin >> n;
    if (n <= 7) {
        cout << -1 << endl;
        for (int i = 2; i <= n; ++i) {
            cout << 1 << " " << i << endl;
        }
    } else {
        cout << 1 << " " << 2 << endl << 1 << " " << 3 << endl << 3 << " " << 6 << endl << 2 << " " << 4 << endl << 2
             << " " << 5 << endl;
        for (int i = 7; i <= n; ++i) {
            cout << 4 << " " << i << endl;
        }
        for (int i = 2; i <= n; ++i) {
            cout << 1 << " " << i << endl;
        }
    }
}


#include <bits/stdc++.h>

using namespace std;
#define ll long long
#define ull unsigned ll
#define all(x) x.begin(), x.end()
typedef vector<ll> vll;
typedef vector<int> vi;
typedef pair<ll, ll> pll;
const int N = 1e3;
const ll M = 1e9 + 7;

int main() {
    int n;
    cin >> n;

    if (n <= 3) {
        cout << -1 << endl;
        for (int i = 0; i < n - 1; ++i) {
            cout << 1 << " " << i + 2 << endl;
        }
    } else {
        cout << 1 << " " << 2 << endl;
        cout << 1 << " " << 3 << endl;
        for (int i = 0; i < n - 3; ++i) {
            cout << 2 << " " << i + 4 << endl;
        }
        for (int i = 0; i < n - 1; ++i) {
            cout << 1 << " " << i + 2 << endl;
        }
    }
}


/* created   : 2020-03-02 14:47:49
 * accepted  : 2020-03-02 15:07:57
 * author    : landcold7
 */
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define mt make_tuple
#define all(x) (x).begin(), (x).end()
#ifndef LOCAL
#define trace(...)
#endif
typedef long long ll;

void solve() {
  int n; cin >> n;
  if (n <= 7) {
    cout << -1 << '\n';
  }
  else {
    cout << 1 << ' ' << 2 << '\n';
    cout << 1 << ' ' << 3 << '\n';
    cout << 2 << ' ' << 4 << '\n';
    cout << 2 << ' ' << 5 << '\n';
    cout << 3 << ' ' << 6 << '\n';
    cout << 4 << ' ' << 7 << '\n';
    cout << 4 << ' ' << 8 << '\n';
    for (int i = 9; i <= n; i++) {
      cout << 3 << ' ' << i << '\n';
    }
  }
  for (int i = 1; i < n; i++) {
    cout << i << ' ' << i + 1 << '\n';
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
  return 0;
}


/* created   : 2020-03-02 14:47:49
 * accepted  : 2020-03-02 15:14:20
 * author    : landcold7
 */
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define mt make_tuple
#define all(x) (x).begin(), (x).end()
#ifndef LOCAL
#define trace(...)
#endif
typedef long long ll;

void solve() {
  int n; cin >> n;
  if (n <= 5) {
    cout << -1 << '\n';
  }
  else {
    cout << 1 << ' ' << 2 << '\n';
    cout << 1 << ' ' << 3 << '\n';
    cout << 1 << ' ' << 4 << '\n';
    for (int i = 5; i <= n; i++) {
      cout << 2 << ' ' << i << '\n';
    }
  }
  for (int i = 1; i < n; i++) {
    cout << i << ' ' << i + 1 << '\n';
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
  return 0;
}


/* created   : 2020-03-02 14:47:49
 * accepted  : 2020-03-02 15:07:57
 * author    : landcold7
 */
#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
#define mt make_tuple
#define all(x) (x).begin(), (x).end()
#ifndef LOCAL
#define trace(...)
#endif
typedef long long ll;

void solve() {
  int n; cin >> n;
  if (n <= 5) {
    cout << -1 << '\n';
  }
  else {
    cout << 1 << ' ' << 2 << '\n';
    cout << 1 << ' ' << 3 << '\n';
    cout << 1 << ' ' << 4 << '\n';
    for (int i = 5; i <= n; i++) {
      cout << 2 << ' ' << n << '\n';
    }
  }
  for (int i = 1; i < n; i++) {
    cout << i << ' ' << i + 1 << '\n';
  }
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  solve();
  return 0;
}