#include<iostream>
using namespace std;
typedef struct Gnode
{
int index;
struct Gnode *next;
}Gnode;
int N,M;//N表示顶点,M表示边,有向图
int main()
{
scanf("%d %d",&N,&M);
int **area=new int*[N];
int **area2=new int*[N];
int i,j;
for(i=0;i<N;i++)
{
area[i]=new int[N];
area2[i]=new int[N];
}
for(i=0;i<N;i++)
for(j=0;j<N;j++)
area[i][j]=0;
Gnode *G=new Gnode[N];
Gnode *G2=new Gnode[N];
for(i=0;i<N;i++)
{
G[i].index=i;
G[i].next=NULL;
G2[i].index=i;
G2[i].next=NULL;
}
for(i=0;i<M;i++)
{
int a,b;
scanf("%d %d",&a,&b);
area[a][b]=1;
Gnode *temp=&G[a];
while(temp->next!=NULL)
temp=temp->next;
Gnode *temp2=new Gnode;
temp2->index=b;
temp2->next=NULL;
temp->next=temp2;
}
printf("before transposition\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d ",area[i][j]);
printf("\n");
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%d",G[i].index);
Gnode *temp=&G[i];
while(temp->next!=NULL)
{
temp=temp->next;
printf(" -> %d",temp->index);
}
printf(" -> ^\n");
}
printf("\nAfter transposition\n");
for(i=0;i<N;i++)
for(j=0;j<N;j++)
area2[j][i]=area[i][j];
for(i=0;i<N;i++)
{
int a=G[i].index;
int b;
Gnode *temp=&G[i];
while(temp->next!=NULL)
{
temp=temp->next;
b=temp->index;
Gnode *temp2=new Gnode;
temp2->index=a;
Gnode *temp3=&G2[b];
while(temp3->next!=NULL)
temp3=temp3->next;
temp3->next=temp2;
temp2->next=NULL;
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
printf("%d ",area2[i][j]);
}
printf("\n");
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%d",G2[i].index);
Gnode *temp=&G2[i];
while(temp->next!=NULL)
{
temp=temp->next;
printf(" -> %d",temp->index);
}
printf(" -> ^\n");
}
return 0;
}