void tarjan (int u, int x)
{
DFN[u] = low[u] = ++ord;
instack[u] = 1;
st[top++] = u;
for (int i = head[u]; ~i; i = edge[i].next)
{
int v = edge[i].to;
if (edge[i].id == x)
{
continue;
}
if (DFN[v] == -1)
{
tarjan (v, edge[i].id);
low[u] = min(low[u], low[v]);
if (low[v] > DFN[u])
{
bridge[++cnt] = edge[i].w;
}
}
else if (instack[v])
{
low[u] = min(low[u], DFN[v]);
}
}
int v;
if (DFN[u] == low[u])
{
++sccnum;
do
{
v = st[--top];
instack[v] = 0;
}while (u != v);
}
}