<｜begin▁of▁sentence｜>### Instruction:
Imagine you are assisting a scholar who is conducting a study on the organizational structure of a small-scale think tank. The think tank's communication pattern has been mapped out as a directed graph, indicating who initiates contact with whom within the organization. The connections are documented in a set of tuples representing directed edges: [(0, 1), (1, 2), (2, 1)], where each number represents an individual in the think tank.

The scholar wishes to explore the depth of this communication network, starting from the individual labeled as '0', by traversing the network in a depth-first manner. As they proceed, there is a need to categorize each connection based on its nature. These categories are described as 'forward' for edges that lead to unvisited nodes, 'nontree' for edges that do not lead to unvisited nodes but are part of the structure, 'reverse' for edges that go back to an ancestor in the DFS tree, and 'reverse-depth_limit' for edges that reach a predefined depth limit and turn back.

In the context of this research, how would you suggest they systematically go about their depth-first-search traversal and accurately label each edge according to these categories, starting from individual '0'? The aim is to build a comprehensive understanding of the think tank's communication network dynamics.
### Response:
import networkx as nx

# Create a directed graph
G = nx.DiGraph([(0, 1), (1, 2), (2, 1)])

# Execute DFS, starting from node 0
edges = list(nx.dfs_labeled_edges(G, source=0))

# Print the edges labeled by type
for edge in edges:
    print(edge)
<|EOT|>
