#include<bits/stdc++.h>
using namespace std;
const int N=400+7,p=998244353;
int n,m,dis[N][N]; int cnt[N];
struct edg{
	int u,t;
}e[N<<1];
vector<int>v[N];
int main(){
	cin>>n>>m; int a,b;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++) dis[i][j]=n+1;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b),e[i].u=a,e[i].t=b,v[a].push_back(b),v[b].push_back(a);
		dis[a][b]=dis[b][a]=1;
	}
	for(int i=1;i<=n;i++) dis[i][i]=0;
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			int x=dis[i][j];
			memset(cnt,0,sizeof(cnt)); bool fl=0;
			for(int k=1;k<=n;k++){
//				if(i==1&&j==2) cout<<dis[i][k]<<","<<dis[j][k]<<"zxak"<<endl;
				if(dis[i][k]+dis[j][k]==x) cnt[dis[i][k]]++;
			}
			for(int k=0;k<=x;k++) if(cnt[k]!=1) fl=1;
//			cout<<i<<","<<j<<","<<x<<","<<cnt[0]<<","<<cnt[1]<<","<<dis[1][1]+dis[1][2]<<endl;
			if(fl){
				printf("0 "); continue;
			}
//			cout<<i<<","<<j<<endl;
			int ans=1;
			for(int k=1;k<=n;k++){
				if(dis[i][k]+dis[j][k]==x) continue; int val=0;
				for(int q=0;q<v[k].size();q++){
					int u=v[k][q];
					if(dis[u][i]-dis[u][j]==dis[i][k]-dis[j][k]&&dis[i][u]+1==dis[i][k]) val++;
					
				}
				ans=1ll*ans*val%p; 
			}
			printf("%d ",ans);
		}
		puts("");
	}
	return 0;
}
//10
//9 3 10 2 1 6 7 5 4 8