//#include <stdio.h>
//int a[10001];
//int n, i, j, temp, min;
//int main()
//{
// scanf("%d", &n);
// for (i = 1; i <= n; i++)
// scanf("%d", &a[i]);
// for (i=1; i<n; i++)
// {
// min=i;
// for (j=i+1; j<=n; j++)
// {
// if(a[min]>=a[j])
// min=j;
// }
// temp = a[i];
// a[i] = a[min];
// a[min] = temp;
// }
// for (i=1; i<=n; i++)
// printf("%d\n", a[i]);
// return 0;
//}
/*
#include <stdio.h>
int partition(int a[],int begin,int end)
{
int temp;
int pivot=(begin+end)/2;
int L=begin,R=end;
while(L<R)
{
while(a[L]<a[pivot]&&L<R) L++;
while(a[R]>=a[pivot]&&L<R) R--;
if(L<R)
{
temp=a[L];
a[L]=a[R];
a[R]=temp;
if(L==pivot)
pivot=R;
}
}
temp=a[pivot];
a[pivot]=a[R];
a[R]=temp;
return R;
}
void quickSort(int a[], int begin, int end)
{
int p;
if(begin<end)
{
p=partition(a,begin,end);
quickSort(a,begin,p-1);
quickSort(a,p+1,end);
}
}
int main()
{
int arr[8]= {9,8,6,99,34,234,12,1};
int size = 8;
quickSort(arr,0,size-1);
for(int i=0;i<size;i++)
{
printf("%d ",arr[i]);
}
}
*/
/*
#define MAX 8
int size;
int sorted[MAX];
int merge(int a[],int m,int middle,int n)
{
int i,j,k,t;
i=m;
j=middle+1;
k=m;
while(i<=middle&&j<=n)
{
if(a[i]<=a[j])
{
sorted[k]=a[i];
i++;
}
else
{
sorted[k]=a[j];
j++;
}
k++;
}
if(i>middle) for(t=j;t<=n;t++,k++) sorted[k]=a[t];
else for(t=i;t<=middle;t++,k++) sorted[k]=a[t];
for(t=m;t<=n;t++) a[t]=sorted[t];
}
void mergeSort(int a[],int m,int n)
{
int middle=(m+n)/2;
if(n>m)
{
mergeSort(a,m,middle);
mergeSort(a,middle+1,n);
merge(a,m,middle,n);
}
}
int main ()
{
int arr[8]={5,32,6,23,43,6,2,555};
mergeSort(arr,0,7);
for(int i=0;i<8;i++)
{
printf("%d ",sorted[i]);
}
return 0;
}
*/
/*
int binsea(int a[],int low,int high,int key)
{
int middle=(low+high)/2;
if(key==a[middle]) return middle;
else if(key<a[middle])
{
binsea(a,low,middle-1,key);
}
else
{
binsea(a,middle+1,high,key);
}
}
int main ()
{
int arr[8]= {1,7,14,67,69,87,98,99};
int k=14;
printf("위치 : %d\n",binsea(arr,0,7,k));
}
*/
/*
#define MAX_VERTEX 30
typedef struct graphType
{
int n;
int adjMatrix[MAX_VERTEX][MAX_VERTEX];
} graphType;
void createGraph(graphType* g)
{
int i,j;
g->n=0;
for(i=0;i<MAX_VERTEX;i++)
{
for(j=0;j<MAX_VERTEX;j++)
{
g->adjMatrix[i][j]=0;
}
}
}
void insertVertex(graphType* g,int v)
{
if(((g->n)+1)>MAX_VERTEX)
{
printf("\n 그래프 정점의 개수를 초과하였습니다!");
return;
}
g->n++;
}
void insertEdge(graphType* g, int u,int v)
{
c
}
void print_adjMatrix(graphType* g)
{
int i,j;
for(int i=0;i<(g->n);i++)
{
printf("\n\t\t");
for(int j=0;j<(g->n);j++)
{
printf("%2d",g->adjMatrix[i][j]);
}
}
}
void main()
{
int i;
graphType *G1,*G2,*G3,*G4;
G1=(graphType *)malloc(sizeof(graphType));
G2=(graphType *)malloc(sizeof(graphType));
G3=(graphType *)malloc(sizeof(graphType));
G4=(graphType *)malloc(sizeof(graphType));
createGraph(G1);createGraph(G2);createGraph(G3);createGraph(G4);
for(i=0;i<4;i++)
{
insertVertex(G1,i);
}
insertEdge(G1,0,1);
insertEdge(G1,0,3);
insertEdge(G1,1,0);
insertEdge(G1,1,2);
insertEdge(G1,1,3);
insertEdge(G1,2,1);
insertEdge(G1,2,3);
insertEdge(G1,3,0);
insertEdge(G1,3,1);
insertEdge(G1,3,2);
printf("\n G1의 인접행렬");
print_adjMatrix(G1);
}
*/
#define MAX 100
int b[100];
typedef struct graphType
{
int n;
int adjMatrix[MAX][MAX];
} graphType;
void createGraph(graphType* g)
{
int i,j;
g->n=0;
for(i=0;i<MAX;i++)
{
for(j=0;j<MAX;j++)
{
g->adjMatrix[i][j]=0;
}
}
}
void insertVertex(graphType* g,int v)
{
if(((g->n)+1)>MAX)
{
return;
}
g->n++;
}
void insertEdge(graphType* g,int u,int v)
{
if(u>=g->n || v>=g->n)
{
return;
}
g->adjMatrix[u][v]=1;
}
void print_adjMatrix(graphType *g)
{
int i,j;
for(int i=0;i<(g->n);i++)
{
printf("\n\t\t");
for(int j=0;j<(g->n);j++)
{
printf("%2d",g->adjMatrix[i][j]);
}
}
}
int push(int n)
{
}
int pop()
{
}
int main ()
{
int n,k;
int a,b;
int q=0,c=0;
graphType *G;
G=(graphType *)malloc(sizeof(graphType));
scanf("%d%d",&n,&k);
createGraph(G);
for(int i=0;i<n;i++)
{
insertVertex(G,i);
}
for(int i=0;i<k;i++)
{
scanf("%d %d",&a,&b);
insertEdge(G,a,b);
}
print_adjMatrix(G);
}