← Home
package main

import (
	"bufio"
	"io"
	"os"
	"strconv"
)

const MOD int64 = 998244353

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) && (data[idx] < '0' || data[idx] > '9') {
			idx++
		}
		val := 0
		for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
			val = val*10 + int(data[idx]-'0')
			idx++
		}
		return val
	}

	n := nextInt()
	m := nextInt()

	g := make([][]int, n)
	for i := 0; i < m; i++ {
		a := nextInt() - 1
		b := nextInt() - 1
		g[a] = append(g[a], b)
		g[b] = append(g[b], a)
	}

	var dist [400][400]int16
	var q [400]int

	for s := 0; s < n; s++ {
		for i := 0; i < n; i++ {
			dist[s][i] = -1
		}
		head, tail := 0, 0
		q[tail] = s
		tail++
		dist[s][s] = 0

		for head < tail {
			v := q[head]
			head++
			dv := dist[s][v]
			for _, to := range g[v] {
				if dist[s][to] == -1 {
					dist[s][to] = dv + 1
					q[tail] = to
					tail++
				}
			}
		}
	}

	var ans [400][400]int64

	for i := 0; i < n; i++ {
		dx := dist[i][:n]
		for j := i; j < n; j++ {
			dy := dist[j][:n]
			dxy := dx[j]

			pathCount := 0
			for v := 0; v < n; v++ {
				if dx[v]+dy[v] == dxy {
					pathCount++
				}
			}

			var res int64
			if pathCount == int(dxy)+1 {
				res = 1
				for v := 0; v < n; v++ {
					if dx[v]+dy[v] == dxy {
						continue
					}
					cnt := 0
					for _, u := range g[v] {
						if dx[u]+1 == dx[v] && dy[u]+1 == dy[v] {
							cnt++
						}
					}
					res = res * int64(cnt) % MOD
					if res == 0 {
						break
					}
				}
			}

			ans[i][j] = res
			ans[j][i] = res
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer w.Flush()

	line := make([]byte, 0, n*12)
	for i := 0; i < n; i++ {
		line = line[:0]
		for j := 0; j < n; j++ {
			if j > 0 {
				line = append(line, ' ')
			}
			line = strconv.AppendInt(line, ans[i][j], 10)
		}
		line = append(line, '\n')
		w.Write(line)
	}
}