#include <iostream>
#include <queue>
#include <cstring>
#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef long long ll;
typedef vector<ll> vll;
const int inf=10000000;
int n;
bool visited[10005];
int deg[10005];
vi deglist[3];
vi g[10005];
int ans[105][105];
typedef pair<int,int> P;
typedef pair<int,pair<int,int> > PP;

int main(int argc,char const* argv[])
{
  cin >> n;
  memset(visited,false,sizeof(visited));
  memset(deg,0,sizeof(deg));
  memset(ans,0,sizeof(ans));
  for(int i=0;i<2*n*(n-1);i++)
    {
      int a,b;
      cin >> a >> b;
      a--;
      b--;
      deg[a]++;
      deg[b]++;
      g[a].push_back(b);
      g[b].push_back(a);
    }
  for(int i=0;i<10005;i++)
    {
      if(deg[i]==2) deglist[0].push_back(i);
      else if(deg[i]==3) deglist[1].push_back(i);
      else if(deg[i]==4) deglist[2].push_back(i);
    }
  int twodind=0;
  ans[0][0]=deglist[0][twodind];
  int pretwo=ans[0][0];
  twodind++;
  if(n==2)
    {
      ans[0][1]=g[pretwo][0];
      visited[g[pretwo][0]]=true;;
      ans[1][0]=g[pretwo][1];
      visited[g[pretwo][1]]=true;
      for(int i=0;i<deglist[0].size();i++)
	{
	  if(!visited[deglist[0][i]])
	    {
	      ans[1][1]=deglist[0][i];
	      break;
	    }
	}
    }
  for(int x=1;x<n;x++)
    {
      int prev=ans[0][x-1];
      if(x!=n-1)
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==3 && !visited[g[prev][k]])
		{
		  ans[0][x]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		  break;
		}
	    }
	}
      else
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==2 &&!visited[g[prev][k]])
		{
		  ans[0][x]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		}
	    }
	}
    }
  for(int y=1;y<n;y++)
    {
      int prev=ans[y-1][n-1];
      if(y!=n-1)
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==3 && !visited[g[prev][k]])
		{
		  ans[y][n-1]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		  break;
		}
	    }
	}
      else
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==2 && !visited[g[prev][k]])
		{
		  ans[y][n-1]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		}
	    }
	}
    }
  for(int x=n-2;x>=0;x--)
    {
      int prev=ans[n-1][x+1];
      if(x!=0)
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==3 &&!visited[g[prev][k]])
		{
		  ans[n-1][x]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		  break;
		}
	    }
	}
      else
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==2 &&!visited[g[prev][k]])
		{
		  ans[n-1][x]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		}
	    }
	}
    }
  for(int y=n-2;y>=0;y--)
    {
      int prev=ans[y+1][0];
      if(y!=0)
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==3 &&!visited[g[prev][k]])
		{
		  ans[y][0]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		  break;
		}
	    }
	}
      else
	{
	  for(int k=0;k<g[prev].size();k++)
	    {
	      if(deg[g[prev][k]]==2 && !visited[g[prev][k]])
		{
		  ans[y][0]=g[prev][k];
		  visited[g[prev][k]]=true;
		  //g[prev].erase(g[prev].begin()+k);
		}
	    }
	}
    }
  if(n>=3)
    {
      for(int y=1;y<n-1;y++)
	{
	  for(int x=1;x<n-1;x++)
	    {
	      int prev1=ans[y-1][x];
	      int prev2=ans[y][x-1];
	      bool get=false;
	      for(int k1=0;k1<g[prev1].size();k1++)
		{
		  for(int k2=0;k2<g[prev2].size();k2++)
		    {
		      if(g[prev1][k1]==g[prev2][k2] && !visited[g[prev1][k1]])
			{
			  ans[y][x]=g[prev1][k1];
			  visited[g[prev1][k1]]=true;
			  get=true;
			  break;
			}
		    }
		  if(get) break;
		}
	    }
	}
    }
  for(int i=0;i<n;i++)
    {
      for(int j=0;j<n;j++)
	{
	  if(j!=n-1)
	    {
	      cout << ans[i][j]+1 << ' ';
	    }
	  else
	    {
	      cout << ans[i][j]+1 << endl;
	    }
	}
    }
    
  return 0;
}



Measured memory_bytes: 3848