/*
    題意: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;
}