/*																													   
 Templatka c++ Kacper Fis																							   																											   //
*/																													  
																								   
#include <bits/stdc++.h>																							   
																													   
using namespace std; 																								   
																													   
const int INF = 1000000001;																						   
const float PI = 3.14;																								   
typedef long long LL;																								   
																													   
typedef vector<int> vi;																								   
typedef list<int> li;																								   
typedef queue<int> qi; 																								   
typedef pair<int,int> ii; 																							   
typedef map<string,int> msi; //np msi['nazwa'] = 'liczba'															   
typedef vector<ii> vii; //vector par<int>, do tworzenia tablicy dla grafów wagowych #dijkstra #Bellman_Ford			   
typedef priority_queue< ii, vector<ii>, greater<ii> > pq; //kolejka priorytetowa vectorów par(top()=min) #dijkstra	   
																													   																				   
vector<ii>::iterator iter;																							   
																													   																				   
#define print_list(x) for(it = (x).begin(); it != (x).end(); it++) {cout << *it << " ";}							   
#define print_vector(x) for(it2 = (x).begin(); it2 != (x).end(); it2++) {cout << *it2 << " ";}						   
#define search_list(x) for(it = (x).begin(); it != (x).end(); it++)													   
#define search_vector(x) for(it2 = (x).begin(); it2 != (x).end(); it2++);											   
#define pb(x) push_back(x) 																							   
#define pf(x) push_front(x)																							   
#define mp(x, y) make_pair(x, y)                                                                                       
///////////////////////////////////////////////GLOBAL DEFINITIONS////////////////////////////////////////////////////////

int tab[1005][1005];

///////////////////////////////////////////////////FUNCTIONS/////////////////////////////////////////////////////////////

void BFS(int v, list<int> tab2[], int color[], int d[]){
	list<int>::iterator it2;
	int u;
	qi q;
	color[v] = 1;
	q.push(v);
	
	while(!q.empty()){
		u = q.front();
		q.pop();
		
		for(it2 = tab2[u].begin(); it2 != tab2[u].end(); it2++){
			if(color[*it2] == 0){
				color[*it2] = 1;
				d[*it2] = d[u] + 1;
				q.push(*it2);
			}
		}
		color[u] = 2;
	}
}

/////////////////////////////////////////////////////MAIN////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])																					 
{ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);                  												       
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	int n, k;
	cin >> n >> k;
	
	int suma = ((n - 1) * (n - 2)) / 2;
	
	//cout << suma << endl;
	if(k > suma){
		cout << "-1" << endl;
		return 0;
	}
	
	for(int i = 2; i <= n; i++){
		tab[1][i] = 1;
		//cout << "1 -> " << i << endl;
	}
	
	int temp = suma-k;
	//cout << "TEMP: " << temp << endl;
	int i = 2;
	while(temp > 0 && i <= n){
		int j = i+1;
		while(j <= n){
			tab[i][j] = 1;
			temp--;
			j++;
			if(temp == 0){
				break;
			}
		}
		i++;
	}
	
	int licznik = 0;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(i != j){
				if(tab[i][j] == 1){
					licznik++;
				}
			}
		}
	}
	
	//li tab2[10005];
	cout << licznik << '\n';
	//cout << "graf po modyfikacji: " << endl;
	for(int p = 1; p <= n; p++){
		for(int j = 1; j <= n; j++){
			if(tab[p][j] == 1){
				cout << p << " " << j << '\n';
				//tab2[p].pb(j);
				//tab2[j].pb(p);				
			}
		}
	}
	
	
	//BFS
	
	//for(int p = 1; p <= n; p++){
		//int d[10005];
		//int color[10005];
		//fill(color, color+10005, 0);
		//fill(d, d+10005, 0);
		
		//cout << "odleglosci od " << p << ": " << endl;
		//BFS(p, tab2, color, d);
		//for(int j = 1; j <= n; j++){
			//cout << p << "-> " << j << " : " << d[j] << endl;
		//}
	//}
	
	
	
	
	
	return 0;
}


Measured memory_bytes: 640