#include <fstream>
#include <iostream>
#include <stdio.h>
using namespace std;
int n,m;
int a[101][101],tr[101][101];
const int oo=1000000;
int main()
{
    ifstream fi("floyd.inp");
    ofstream fo("floyd.out");
    fi>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) {a[i][j]=oo; tr[i][j]=j;}
     for(int i=1;i<=n;i++) a[i][i]=0;
    for(int i=1;i<=m;i++)
    {
        int x,y,w;
        fi>>x>>y>>w;
        a[x][y]=w;
    }
    fo<<"D0"<<endl;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(a[i][j]==oo) fo<<"oo "; else fo<<a[i][j]<<" ";
        fo<<endl;
    } fo<<endl;

    fo<<"P0"<<endl;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            if(tr[i][j]==-1) fo<<"nil "; else fo<<tr[i][j]<<" ";
        fo<<endl;
    }
    fo<<"================"<<endl;


    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
           if(a[i][k]!=oo && a[k][j]!=oo && a[i][j]>a[i][k]+a[k][j])
           {
             a[i][j]=a[i][k]+a[k][j];
             tr[i][j]=tr[i][k];
           }


       fo<<"D"<<k<<endl;
       for(int i=1;i<=n;i++)
       {
        for(int j=1;j<=n;j++)
            if(a[i][j]==oo) fo<<"oo "; else fo<<a[i][j]<<" ";
        fo<<endl;
       } fo<<endl;

       fo<<"P"<<k<<endl;
       for(int i=1;i<=n;i++)
       {
        for(int j=1;j<=n;j++)
            if(tr[i][j]==-1) fo<<"nil "; else fo<<tr[i][j]<<" ";
        fo<<endl;
       }
       fo<<"================"<<endl;
    }

    for(int i=1;i<=n;i++)
         for(int j=1;j<=n;j++)
            if(i!=j)
         {
             int u=i,v=j;
           fo<<"Do dai tu "<<u<<" den "<<v<<":"<<a[u][v]<<endl;
           fo<<"  -Duong di: ";
           do
           {
                fo<<u<<"->";
                u=tr[u][v];
           } while (u!=v);
           fo<<u<<endl;

         }
    fi.close();
    fo.close();
}

