using namespace std;
const int MAX=100;
const int inf=1<<30;
queueQ;
int ShortestAugmentingPath(int n,int source,int sink,int map[][MAX],int flow[][MAX],int pre_t[])
{
if(source==sink) //特殊情况处理
return inf;
int i,x;
int visited[MAX]; //visited[i]=1表示顶点i被标记
int rest[MAX][MAX]; //rest[i][j]表示顶点i到j的未使用流量
int L[MAX]; //L[i]记录一次迭代过程中节点i的最大增量
int pre[MAX]; //pre[i]=0表示顶点i未标记,pre[i] >0 表示前向边,pre[i]
//数组初始化
memset(rest,0,sizeof(rest));
memset(visited,0,sizeof(visited));
memset(flow,0,(n+1)*sizeof(flow[0]));
memset(L,0x7f,n*sizeof(L[0]));
memset(pre,0,sizeof(pre));
pre[source]=source+1; //任意赋值为一个整数
while(!Q.empty())
Q.pop();
Q.push(source); //最初,源点入队
while(!Q.empty())
{
visited[source]=1; //源点被标记
i=Q.front();
Q.pop();
for(x=1;x<=n;x++) //前向边
{
if(i!=x&&!visited[x]&&map[i][x]!=inf)
{
rest[i][x]=map[i][x]-flow[i][x];
if( rest[i][x] > 0 )
{
L[x]=L[i]
Q.push(x);
visited[x]=1;
pre[x]=i;
}
}
}
for(x=1;x<=n;x++) //后向边
{
if(i!=x&&!visited[x]&&map[x][i]!=inf)
{
if(flow[x][i] > 0)
{
L[x]=L[i]
Q.push(x);
visited[x]=1;
pre[x]=-i;
}
}
}
for(int y=1;y<=n;y++) //记录最后一次迭代结果的标记,即为最小割
pre_t[y]=pre[y];
if(visited[sink]==1) //汇点被标记了
{
x=sink;
while(x!=source) //从汇点开始用第二个标记反向移动
{
if(pre[x]>0)
flow[i][x] += L[sink];
else
flow[i][x] -= L[sink];
x=i;
if(pre[i]>0 )
i=pre[i];
else
i=-pre[i];
}
memset(visited,0,sizeof(visited)); //擦除标记
memset(L,0x7f,n*sizeof(L[0]));
while(!Q.empty())
Q.pop();
Q.push(source); //用源点对q重新初始化
memset(pre,0,sizeof(pre));
pre[source]=1;
}
}
int maxflow=0;
for(i=1; i <= n;i++)
maxflow+=flow[i][sink];
return maxflow;
}
int main()
{
int map[MAX][MAX],flow[MAX][MAX],pre[MAX];
int n,i,x,w;
cout<
while(cin>>n && n)
{
for(i=1;i<=n;i++)
{
for(x=1;x<=n;x++)
map[i][x]=inf;
}
int m; //输入边数
cout<
cin>>m;
cout<
while(m--)
{
cin>>i>>x>>w;
map[i][x]=w;
}
cout<
cout<
for(i=1;i<=n;i++)
{
if(pre[i]!=0 )
cout<
}
cout<
for(i=1;i<=n;i++)
{
if(pre[i]==0)
cout<
}
cout<
}
return 0;
}