/*
    题意:n张等高的纸,每张纸有一条线,每张纸能旋转180°
           问能否将全部纸凑起来,那些线段成一条
   其实很简单的
   对每张纸,建多一个旋转之后的纸
   然后排序,排序规则按照原本是升的就升,降的就降
   最后统计一下能拼在一起的个数是否为n
*/

#include
<cstdio>
#include
<cstring>
#include
<algorithm>
#include
<cstdlib>
using namespace std;

const int MAXN = 50000;

struct Strip
{
    
int a,b,id;
}
strips[MAXN*2+10];

bool vi[MAXN+10];
int ans[MAXN+10];

bool cmp(const Strip &a,const Strip &b)
{
    
if(a.a>a.b)return a.a>b.a;
    
return a.a<b.a;
}

int main()
{    
    
//freopen("in","r",stdin);
    int h,n;
    
while(~scanf("%d%d",&h,&n))
    
{
        
int w,line=true;
        
for(int i=1;i<=n;i++)
        
{
            scanf(
"%d%d",&strips[i].a,&strips[i].b);
            strips[i].id
=i;
            strips[i
+n].a=h-strips[i].b;
            strips[i
+n].b=h-strips[i].a;
            strips[i
+n].id=-i;
            
if(i==1)w=strips[i].a-strips[i].b;
            
else if(w!=strips[i].a-strips[i].b)line=false;
        }

        
if(!line){puts("0");continue;}
        sort(strips
+1,strips+1+2*n,cmp);
        memset(vi,
0,sizeof(vi));
        
int cnt=0,y=strips[1].a;
        
for(int i=1;i<=2*n;i++)
        
{
            
if(vi[abs(strips[i].id)])continue;
            
if(y==strips[i].a)
            
{
                ans[
++cnt]=strips[i].id;
                y
=strips[i].b;
                vi[abs(strips[i].id)]
=1;
            }

        }

        
if(cnt<n)puts("0");
        
else 
        
{
            
for(int i=1;i<=n;i++)
                printf(
"%d ",ans[i]);
            puts(
"");
        }

    }

    
return 0;
}