#include<stdio.h>
#include<string.h>
int z[101],elem,qqq,x[101][101],i,kkt,fin,w,j,n,m,k,l,a,s,poz,q,y[101];
void interschimb(int k, int p)
{
int i;
memcpy(z,x[k],sizeof(x[k]));
memcpy(x[k],x[p],sizeof(x[p]));
memcpy(x[p],z,sizeof(z));
}
void afis(int a,int b)
{
printf("%d %d\n",a,b);
}
void golesc(int poz)
{
int i,j;
while (x[poz][0]>1)
{
for (i=n+1;i>poz;i--)
while (x[i][0]<n&&x[poz][0]>1)
{
x[i][0]++;
x[i][x[i][0]]=x[poz][x[poz][0]];
x[poz][x[poz][0]]=0;
x[poz][0]--;
// y[poz]=0;
afis(poz,i);
}
}
}
int caut(int nr,int q)
{
int i,j,k,p;
k=1000;
for (i=q+1;i<=n+1;i++)
{
for (j=x[i][0];j>=1;j--)
if (x[i][j]==nr)
{
if (j<k) {k=j;p=i;}
j=1;
}
}
return p;
}
int clear(int poz,int nr)
{
int i,j,k;
k=1;
while (x[poz][x[poz][0]]!=nr)
{
for (i=n+1;i>q;i--)
if (x[i][0]<n&&poz&&x[poz][x[poz][0]]!=nr&&i!=poz&&x[poz][0])
{
x[i][++x[i][0]]=x[poz][x[poz][0]];
x[poz][x[poz][0]]=0;
x[poz][0]--;
printf("%d %d\n",poz,i);
// afis(poz,i);
i=n+2;
}
/* else
if (poz&&x[poz][x[poz][0]]==nr)
{
return i;
}
*/
}
return 1;
}
int ver(int s)
{
int w,k;
k=0;
for (w=i+1;w<=n+1;w++)
{
if (w!=l) k+=n-x[w][0];
if (k>=s) return 1;
}
if (k>=s) return 1;
return 0;
}
int main()
{
freopen("tije.in","r",stdin);
freopen("tije.out","w",stdout);
scanf("%d",&n);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
x[i][++x[i][0]]=i;
for (i=1;i<=n;i++)
{
golesc(i);
memset(y,0,sizeof(y));
y[x[i][1]]=1;
while (x[i][0]<n)
{
fin=101;
elem=-1;
for (j=1;j<=n;j++)
if (y[j]==0)
{
for (l=i+1;l<=n+1;l++)
{
for (w=x[l][0];w>=1&&x[l][w]!=j;w--);
// if (!(w==0&&x[l][1]!=j))
{
s=x[l][0]-w;
if (s<fin) if (ver(s)) {fin=s; poz=l; elem=j;}
}
}
}
kkt=clear(poz,elem); // clear tija poz pana la elementu j
x[poz][x[poz][0]--]=0;
x[i][++x[i][0]]=elem;
// afis(poz,i);
printf("%d %d\n",poz,i);
y[elem]=1;
}
}
return 0;
}