The input to the fully-connected layer should be (in sequence classification tasks) output[-1]. hidden is usually passed to the decoder in seq2seq models.
In case of a bidirectional model, the last dimension of the output is doubled in size so the output shape is (seq_len, batch, 2 * hidden_size).
To combine these directions (the forward and backward direction) are, some of the options are:

they can be summed
affine transformation can be applied to them (they are propageted through a neural net (nn.Linear(2 * hidden_size, next_layer_input_dim), that network is trained at the same time as the rest of the model)
they are left untouched and passed to the next layer (but in this case the input dim of the next layer has to be doubled in size (2 * hidden_dim))
etc.