Pagini recente » Cod sursa (job #770379) | Cod sursa (job #1883982) | Cod sursa (job #2813161) | Cod sursa (job #2117624) | Cod sursa (job #1150401)
#include<fstream>
#include <vector>
#include <utility>
#include <iostream>
#include<algorithm>
#include <cstring>
#define N 1010
#define mod 1000000007
#define inf 1<<30
#define vint vector<pair<int,int> >::iterator
using namespace std;
ifstream fin ("A.in");
ofstream fout ("A.out");
int n,t,m,a,b;
vector<pair<int,int> > G[100001],V;
int viz[100001],vize[100001],lvl[100001];
struct prin
{
int x,y,z;
}sol[100001];
bool cmp (pair <int,int> a, pair<int,int> b)
{
return lvl[a.first] < lvl[b.first];
}
void dfs (int x, int l)
{
viz[x] = 1;
lvl[x] = l;
for (vint it = G[x].begin(); it != G[x].end(); ++it)
{
if (!viz[it->first])
dfs (it->first,l+1);
}
V.clear();
for (vint it = G[x].begin(); it != G[x].end(); ++it)
{
if (!vize[it->second])
V.push_back (*it);
}
sort (V.begin (), V.end(), cmp);
while (V.size() > 1)
{
pair<int,int> y = V[V.size()-1];
pair<int,int> z = V[V.size()-2];
V.pop_back ();
V.pop_back ();
vize[z.second] = 1;
vize[y.second] = 1;
++t;
sol[t].x =y.first;
sol[t].y = x;
sol[t].z = z.first;
}
}
int main ()
{
freopen ("drumuri.in","r",stdin);
freopen ("drumuri.out","w",stdout);
scanf ("%d %d",&n,&m);
for (int i=1; i<=m; ++i)
{
scanf ("%d %d",&a,&b);
G[a].push_back (make_pair(b,i));
G[b].push_back (make_pair(a,i));
}
if (m%2 == 1)
{
printf("0");
return 0;
}
dfs (1,1);
if (t == m/2)
{
printf("1\n");
for (int i=1; i<=t; ++i)
printf("%d %d %d\n",sol[i].x,sol[i].y,sol[i].z);
}
else
{
printf("0");
}
}