#include<bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
#ifdef CB
freopen("be3.txt","r",stdin);
// freopen("ki.txt","w",stdout);
#endif
int N,M;
cin>>N>>M;
vector<vector<int>>g(N+1);
for(int i=0;i<M;i++){
int a,b;
cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
int x1=0,x2=1e7,x3=2e7;
vector<vector<int>>ans(N+1,vector<int>(N+1,-1));
auto add1=[&](int i,int j)->void{
ans[i][j]=x1;
ans[j][i]=x1;
x1++;
};
auto add2=[&](int i,int j)->void{
ans[i][j]=x2;
ans[j][i]=x2;
x2++;
};
vector<int>v(N+1),w(N+1),p(N+1);
for(int i=1;i<=N;i++){
if(v[i]){
continue;
}
v[i]=1;
vector<int>c;
vector<int>s;
vector<int>t;
auto dfs=[&](auto self,int i)->void{
s.push_back(i);
t.push_back(i);
for(int j:g[i]){
if(j==p[i]){
continue;
}
if(v[j]){
if(v[j]<v[i]){
if(!c.empty()){
cout<<-1<<'\n';
exit(0);
}
c.push_back(j);
w[j]=c.size();
for(int k=s.size()-1;s[k]!=j;k--){
c.push_back(s[k]);
w[s[k]]=c.size();
}
}
if(v[j]>v[i]&&!w[i]){
cout<<-1<<'\n';
exit(0);
}
continue;
}
v[j]=v[i]+1;
p[j]=i;
self(self,j);
}
s.pop_back();
};
dfs(dfs,i);
if(!c.empty()){
for(int i:c){
auto dfs2=[&](auto self,int i,int p)->void{
for(int j:g[i]){
if(j==p||w[j]){
continue;
}
add2(i,j);
self(self,j,i);
}
};
dfs2(dfs2,i,0);
}
for(int i=0;i<c.size();i++){
add1(c[i],c[(i+1)%c.size()]);
}
}
else{
for(int j:t){
add2(j,p[j]);
}
}
}
for(int i=1;i<=N;i++){
for(int j=i+1;j<=N;j++){
if(ans[i][j]==-1){
ans[i][j]=x3++;
}
cout<<ans[i][j]<<' ';
}
cout<<'\n';
}
return 0;
}