///数组下标元素是从0开始记的,而图的顶点序号通常是从1开始计的,
///为避免繁琐,通常默认这种关系
/*
输入描述:输入文件中包含多组测试数据;每组测试数据描绘了一个无权有向图;
每组测试数据第一行为两个正整数n和m,表示有向图的顶点数和边数,顶点序号
从1开始记。接下来为m行,每行两个正整数, 表示一条边的起点和终点。每条边出现一次
且仅一次,不存在自身环和重边。输入文件最后一行为0 0,表示文件结束
输出描述:输出两行。第一行为n个正整数,表示每个顶点的出度。第二行为
n个整数,表示每个顶点的入度;每两个正整数之间用一个空格隔开,每行的最后
一个正整数之后没有空格。
*/
#include<cstdio>
#include<cstring>
#define MAXN 100
int Edge[MAXN][MAXN];
int main()
{
int n,m;
int u,v;
int od,id;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(Edge,0,sizeof(Edge));
for(int i=0;i<m;i++)///构造临结矩阵
{
scanf("%d%d",&u,&v);
Edge[u-1][v-1]=1;
}
for(int i=0;i<n;i++)///输出出度
{
od=0;
for(int j=0;j<n;j++) od+=Edge[i][j];
if(i==0) printf("%d",od);
else printf(" %d",od);
}
printf("\n");
for(int j=0;j<n;j++)///输出入度
{
id=0;
for(int i=0;i<n;i++) id+=Edge[i][j];
if(j==0) printf("%d",id);
else printf(" %d",id);
}
printf("\n");
}
return 0;
}