#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
const int N=1e4+10;
int g[N][N];
int n,m;
struct Edge{
int to,next,w;
}e[N];
int head[N],tot;
void init(){
memset(head,-1,sizeof(head));
tot=0;
memset(g,-1,sizeof(g));
}
void addedge(int u,int v,int w){
g[u][v]=w;
e[tot].to=v;
e[tot].w=w;
e[tot].next=head[u];
head[u]=tot++;
}
bool vis[N];
void dfs(int u){
vis[u]=true;
cout<<u<<" ";
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(g[i][j]!=-1&&!vis[j]){
dfs(j);
}
}
}
void bfs(){
memset(vis,false,sizeof(vis));
queue<int>q;
q.push(0);
vis[0]=true;
while(!q.empty()){
int u=q.front();
q.pop();
cout<<u<<" ";
for(int i=0;i<n;i++){
if(g[u][i]!=-1&&!vis[i]){
vis[i]=true;
q.push(i);
}
}
}
}
int p[N];
void solve(int u,int pos){
p[pos]=u;
if(u==2){
for(int i=0;i<=pos;i++)
cout<<p[i]<<" ";
cout<<endl;
return ;
}
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;
if(vis[v])continue;
vis[v]=true;
solve(v,pos+1);
vis[v]=false;
}
}
int main(){
init();
cin>>n>>m;
while(m--){
int u,v,w;
cin>>u>>v>>w;
addedge(u,v,w);
}
cout<<endl;
cout<<"图g的邻接矩阵:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j) cout<<"0 ";
else cout<<g[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
cout<<"图g的邻接表:"<<endl;
for(int i=0;i<n;i++){
cout<<i<<": ";
for(int j=head[i];~j;j=e[j].next){
cout<<e[j].to<<"["<<e[j].w<<"]-> ";
}
cout<<"^"<<endl;
}
cout<<endl;
cout<<"从0开始的dfs"<<endl;
dfs(0);
cout<<endl;
cout<<"从0开始的bfs"<<endl;
bfs();
cout<<endl;
cout<<"从5到2的所有路径:"<<endl;
memset(vis,false,sizeof(vis));
vis[5]=true;
solve(5,0);
return 0;
}
6 10
0 1 5
0 3 7
1 2 4
2 0 8
2 5 9
3 5 6
4 3 5
5 4 1
5 0 3
3 2 5
6 12
0 1 1
0 3 1
1 2 1
2 0 1
2 5 1
3 2 1
3 5 1
4 3 1
5 0 1
5 1 1
5 3 1
5 4 1