// ~~ icebear love at VOI ~~
#include <bits/stdc++.h>
using namespace std;
static struct FastInput {
static constexpr int BUF_SIZE = 1 << 20;
char buf[BUF_SIZE];
size_t chars_read = 0;
size_t buf_pos = 0;
FILE *in = stdin;
char cur = 0;
inline char get_char() {
if (buf_pos >= chars_read) {
chars_read = fread(buf, 1, BUF_SIZE, in);
buf_pos = 0;
buf[0] = (chars_read == 0 ? -1 : buf[0]);
}
return cur = buf[buf_pos++];
}
inline void tie(int) {}
inline explicit operator bool() {
return cur != -1;
}
inline static bool is_blank(char c) {
return c <= ' ';
}
inline bool skip_blanks() {
while (is_blank(cur) && cur != -1) {
get_char();
}
return cur != -1;
}
inline FastInput& operator>>(char& c) {
skip_blanks();
c = cur;
return *this;
}
inline FastInput& operator>>(string& s) {
if (skip_blanks()) {
s.clear();
do {
s += cur;
} while (!is_blank(get_char()));
}
return *this;
}
template <typename T>
inline FastInput& read_integer(T& n) {
// unsafe, doesn't check that characters are actually digits
n = 0;
if (skip_blanks()) {
int sign = +1;
if (cur == '-') {
sign = -1;
get_char();
}
do {
n += n + (n << 3) + cur - '0';
} while (!is_blank(get_char()));
n *= sign;
}
return *this;
}
template <typename T>
inline typename enable_if<is_integral<T>::value, FastInput&>::type operator>>(T& n) {
return read_integer(n);
}
#if !defined(_WIN32) || defined(_WIN64)
inline FastInput& operator>>(__int128& n) {
return read_integer(n);
}
#endif
template <typename T>
inline typename enable_if<is_floating_point<T>::value, FastInput&>::type operator>>(T& n) {
// not sure if really fast, for compatibility only
n = 0;
if (skip_blanks()) {
string s;
(*this) >> s;
sscanf(s.c_str(), "%lf", &n);
}
return *this;
}
} fast_input;
#define cin fast_input
const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const long long INF = 1e18 + 27092008;
const int N = 500 + 5;
int n, m;
vector<pair<int, int>> G[N];
int dist[N][N];
int main() {
freopen("paths.inp", "r", stdin);
freopen("paths.out", "w", stdout);
int subtask; cin >> subtask;
cin >> n >> m;
memset(dist, 0x3f, sizeof dist);
for(int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
if (u > v) G[u].emplace_back(v, w);
else G[v].emplace_back(u, w);
dist[u][v] = dist[v][u] = min(dist[u][v], w);
}
for(int i = 1; i <= n; i++) dist[i][i] = 0;
for(int k = 1; k <= n; k++)
for(int u = 1; u <= n; u++) for(int v = 1; v <= n; v++) {
dist[u][v] = dist[v][u] = min(dist[u][v], dist[u][k] + dist[k][v]);
}
for(int i = 1; i < n; i++) for(int j = i + 1; j <= n; j++) {
int cnt = 0;
for(int k = 1; k <= n; k++) {
if (dist[i][k] + dist[k][j] != dist[i][j]) continue;
for(auto x : G[k]) {
int v, w; tie(v, w) = x;
if (min(dist[i][k] + dist[j][v], dist[i][v] + dist[j][k]) + w == dist[i][j])
cnt++;
}
}
cout << cnt << " \n"[j == n];
}
return 0;
}