Changing the frontend sorting according to different fields
Use Categories for Teacher &amp; Country.  Add inputs for those categories to your Section. 

To create your select inputs:

{% set entryIds = craft.entries.section('events').ids() %}
{% set teachers = craft.categories.relatedTo({ sourceElement: entryIds }).group('teacher').find() %}
{% set countries = craft.categories.relatedTo({ sourceElement: entryIds }).group('country').find() %}
&lt;select&gt;
  {% for item in teachers %}
       &lt;option value='{{ item.title }}'&gt;{{ item.title }}&lt;/option&gt;
  {% endfor %}
&lt;/select&gt;
&lt;select&gt;
  {% for item in countries %}
       &lt;option value='{{ item.title }}'&gt;{{ item.title }}&lt;/option&gt;
  {% endfor %}
&lt;/select&gt;


Then when you submit these as a form or via javascript on your filtered page you would do something like this.

{% set filterId = craft.request.getParam('id') %}
{% set events = craft.entries.section('events').relatedTo({targetElement:filterId}).startDate('and', '&gt;= ' ~ now) %}


If you needed to filter for more than one category group:

{% set entries = craft.entries({
    section: 'events',
    relatedTo: [
        'and',
        { targetElement: craft.request.getParam('teacherId') },
        { targetElement: craft.request.getParam('countryId') }
    ]
}) %}