#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define name "aaaaaa"
#define endl "\n"
#define fi first
#define se second
using ll = long long;
using ull = unsigned ll;
using db = double;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdb = pair<db, db>;
using ppii = pair<ll, pii>;
using vvi = vector<vector<int>>;
void file(){
ios_base::sync_with_stdio(0); cin.tie(0);
if(fopen(name".inp", "r")) {
freopen(name".inp", "r", stdin);
freopen(name".out", "w", stdout);
}
}
const int N = 105;
const int inf = 1e9;
int d[N][N];
void solve(){
int n, m;
cin >> n >> m;
for(int i = 0; i < N; i++){
for(int j = 0; j < N; j++){
d[i][j] = inf;
}
}
while(m--){
int u, v, w; cin >> u >> v >> w;
d[u][v] = d[v][u] = w;
}
for(int i = 1; i <= n; i++){
for(int k = 1; k <= n; k++){
for(int j = 1; j <= n; j++){
if(i == 3 && j == 4 && k == 5)
{
cout<<"gay";
cout<<d[i][k]<<" "<<d[k][j]<<'\n';
}
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
}
}
}
int main(){
file();
int test = 1;
//cin >> test;
while(test--){
solve();
}
cerr << "\nProcess returned 0 (0x0) execution time : " << 1.0*clock()/CLOCKS_PER_SEC << " s" << endl;
}
I3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbmFtZSAiYWFhYWFhIgojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyB1bGwgPSB1bnNpZ25lZCBsbDsKdXNpbmcgZGIgPSBkb3VibGU7CnVzaW5nIGxkID0gbG9uZyBkb3VibGU7CnVzaW5nIHBpaSA9IHBhaXI8aW50LCBpbnQ+Owp1c2luZyBwbGwgPSBwYWlyPGxsLCBsbD47CnVzaW5nIHBkYiA9IHBhaXI8ZGIsIGRiPjsKdXNpbmcgcHBpaSA9IHBhaXI8bGwsIHBpaT47CnVzaW5nIHZ2aSA9IHZlY3Rvcjx2ZWN0b3I8aW50Pj47Cgp2b2lkIGZpbGUoKXsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7CiAgICBpZihmb3BlbihuYW1lIi5pbnAiLCAiciIpKSB7CiAgICAgICAgZnJlb3BlbihuYW1lIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKG5hbWUiLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KfQoKY29uc3QgaW50IE4gPSAxMDU7CmNvbnN0IGludCBpbmYgPSAxZTk7CgppbnQgZFtOXVtOXTsKCnZvaWQgc29sdmUoKXsKICAgIGludCBuLCBtOwogICAgY2luID4+IG4gPj4gbTsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOOyBpKyspewogICAgICAgIGZvcihpbnQgaiA9IDA7IGogPCBOOyBqKyspewogICAgICAgICAgICBkW2ldW2pdID0gaW5mOwogICAgICAgIH0KICAgIH0KICAgIHdoaWxlKG0tLSl7CiAgICAgICAgaW50IHUsIHYsIHc7IGNpbiA+PiB1ID4+IHYgPj4gdzsKICAgICAgICBkW3VdW3ZdID0gZFt2XVt1XSA9IHc7CiAgICB9CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgZm9yKGludCBrID0gMTsgayA8PSBuOyBrKyspewogICAgICAgICAgICBmb3IoaW50IGogPSAxOyBqIDw9IG47IGorKyl7CiAgICAgICAgICAgIAlpZihpID09IDMgJiYgaiA9PSA0ICYmIGsgPT0gNSkKICAgICAgICAgICAgCXsKICAgICAgICAgICAgCQljb3V0PDwiZ2F5IjsKICAgICAgICAgICAgCQljb3V0PDxkW2ldW2tdPDwiICI8PGRba11bal08PCdcbic7CiAgICAgICAgICAgIAl9CiAgICAgICAgICAgICAgICBkW2ldW2pdID0gbWluKGRbaV1bal0sIGRbaV1ba10gKyBkW2tdW2pdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKXsKICAgIGZpbGUoKTsKICAgIGludCB0ZXN0ID0gMTsKICAgIC8vY2luID4+IHRlc3Q7CiAgICB3aGlsZSh0ZXN0LS0pewogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICBjZXJyIDw8ICJcblByb2Nlc3MgcmV0dXJuZWQgMCAoMHgwKSAgIGV4ZWN1dGlvbiB0aW1lIDogICIgPDwgMS4wKmNsb2NrKCkvQ0xPQ0tTX1BFUl9TRUMgPDwgIiBzIiA8PCBlbmRsOwp9